1

我有一个类,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基于应用程序继承并在子级中创建事件处理程序逻辑,使用fn2here。

class B : public A{
public:
    B();
    void fn2();
};

B::B() {
    A::setFn1(&fn2);
}

void B::fn2() {...}

当我打电话时:A::setFn1(&fn2)我收到以下编译器错误。

#169 “void (B:: )()”类型的参数与“void ( )() ”类型的参数不兼容

我的脑子里全是这些空指针,我不知道我是否还在使用正确的设计。该类A包含我所有的实用方法。该类B包含我的应用程序特定功能。

4

2 回答 2

3

非静态成员函数不是自由函数,类型不同。您不能像使用指向函数的指针一样使用非静态成员函数:

struct test {
   void foo();
   static void bar();
};

&test::foo --> void (test::*)()
&test::bar --> void (*)()

我不会像建议将功能更改为那样多,static因为我认为当前的设计并不是特别有用。但是你可以接受这个并尝试重新思考一个更有意义的设计。(所有进程的单个回调函数?为什么要继承?用户定义的构造函数与编译器生成的相同?在不应实例化的类中?...)

于 2013-04-04T19:14:24.380 回答
2

当我调用: A::setFn1(&fn2) 时,我收到以下编译器错误。

fn2是 a 的成员函数B因此您必须限定其名称:

A::setFn1(&B::fn2)
//         ^^^

此外,fn2应该是static,因为非static成员函数实际上在隐式this指针上工作,所以它们接受一个参数:

class B : public A{
public:
    B();
    static void fn2();
//  ^^^^^^
};

通过这两个更改,您的程序应该可以编译。

于 2013-04-04T19:12:33.143 回答