带有继承类的无效指针

时间:2013-04-04 19:06:39

标签: c++

我有一个类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类包含我的应用程序特定功能。

2 个答案:

答案 0 :(得分:3)

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

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

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

我不会建议将函数更改为static,因为我没有发现当前的设计特别有用。但你可以采取这种做法,并试图重新思考一个更有意义的设计。 (所有进程的单个回调函数?为什么要继承?一个用户定义的构造函数与编译器生成的相同?在一个不应该的类中实例?...)

答案 1 :(得分:2)

  

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

fn2B成员函数,因此您必须限定其名称:

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

此外,fn2应为static,因为非static成员函数实际上对隐式this指针起作用,因此它们接受一个参数:

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

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