我有很多类X
的实例,它们每个包含另一个类CB
(有时不止一个CB
)。 CB
类有一个函数指针,它将在某个事件(点击,计时器等)之后被调用。传递一个非静态成员函数作为参数
这将是非常有用,如果我可以只通过一个实例成员函数当地CB
类实例(通过在这种情况下say()
功能),这样一旦CB
触发功能,它会修改的东西在自己的实例只。
实施例的示例代码:
#include <iostream>
class CB {
void (*function)(void);
void init(void (*function)(void)) {
this->function = function;
}
};
class X {
private:
CB cb;
public:
void init() {
cb.init(&(this->say)); //<- Here's the problem
}
void say() {
std::cout << "Hello World!" << std::endl;
}
};
int main() {
X x;
x.init();
}
所以我的上述例子中由于失败线17与错误:
no known conversion for argument 1 from ‘void (X::*)()’ to ‘void (*)()’
是否有可能以某种方式通过一个实例地方say()
功能实例CB
? CB
函数不能被修改,不幸的是会被其他类型的其他类型使用。
我读过其他线程,这很可能是不可能的,除非say()
函数是static
或存在于类外(这意味着它不会访问实例变量)。
是否有可能按照我拥有的方式工作?如果不是最常见的解决方案(这似乎是很多人会遇到的问题)?
你知道如何编写构造函数吗? –
当'CB'调用试图修改其状态的方法时,最好希望你的'X'实例仍然存在。 – CoryKramer
为什么你需要一个函数指针?改用虚拟功能(接口)。 –