我有一个类A
,它需要静态事件处理程序。我需要静态事件处理程序,因为中断正在调用事件处理程序。
class A {
private:
static void (*fn1)();
public:
A();
static void setFn1(void (*function)(void));
static void onEvent();
};
A::A() { }
void A::setFn1(void (*function)(void)) {
fn1 = function;
}
void A::onEvent() {
A::fn1();
}
我想根据应用程序继承A
并创建事件
子进程中的处理程序逻辑,在这里使用fn2
。
class B : public A{
public:
B();
void fn2();
};
B::B() {
A::setFn1(&fn2);
}
void B::fn2() {...}
当我致电:A::setFn1(&fn2)
时,我收到以下编译错误。
类型为“void(B :: )()”的#169参数与“void(
)()类型的参数不兼容
我的脑子里充满了这些虚空指针,我不知道我是否还在使用正确的设计。 A
类包含我的所有实用程序方法。 B
类包含我的应用程序特定功能。
答案 0 :(得分:3)
非静态成员函数不是自由函数,类型不同。您不能使用非静态成员函数,就好像它是指向函数的指针一样:
struct test {
void foo();
static void bar();
};
&test::foo --> void (test::*)()
&test::bar --> void (*)()
我不会建议将函数更改为static
,因为我没有发现当前的设计特别有用。但你可以采取这种做法,并试图重新思考一个更有意义的设计。 (所有进程的单个回调函数?为什么要继承?一个用户定义的构造函数与编译器生成的相同?在一个不应该的类中实例?...)
答案 1 :(得分:2)
当我调用:A :: setFn1(& fn2)时,我收到以下编译错误。
fn2
是B
的成员函数,因此您必须限定其名称:
A::setFn1(&B::fn2)
// ^^^
此外,fn2
应为static
,因为非static
成员函数实际上对隐式this
指针起作用,因此它们接受一个参数:
class B : public A{
public:
B();
static void fn2();
// ^^^^^^
};
通过这两项更改,您的程序应该编译。