函数指向类成员的指针

时间:2013-06-11 03:03:21

标签: c++ function member

我想尝试这样做:

class A {
    void *(*func)(void *);

    A(void *(*function)(void *)){
        func = function;
    }
}

class B {
    void *real_func(void *);
    A ptr;
    B()
    :ptr(&real_func)
    {
        ...
    }
}

但是我收到了这个错误:

  

错误:ISO C ++禁止获取不合格或的地址   括号内的非静态成员函数,以形成指向成员的指针   功能

有人知道如何将函数指针初始化为同一类中的函数成员???

谢谢!

卡洛斯

2 个答案:

答案 0 :(得分:1)

由于real_func不是静态成员函数,因此其类型不能为void *(*)()。相反,它是void *(B::*)(),因此您需要相应地声明func

void *(B::*func)();

// call it like this
pointer_to_b->*func();

如果你小心,你也可以使用指针A作为基类,但你必须确保指向A的指针指向B的实例:

void *(A::*func)();

但是,此时,您大多只是复制虚拟成员函数的功能。所以我建议你改用它:

class A {
    virtual void *func() = 0;
};

class B {
    void *func() {
        // ...
    }
};

答案 1 :(得分:0)

您可以像这样创建B:

struct B {
    static void *real_func(void *);
    A ptr;
    B()
    :ptr(&real_func)
    {
        ...
    }
};

静态成员函数的作用类似于常规函数,因此您可以为它创建函数指针。

如果您不需要常规函数指针,则可以使用std :: function:

#include <functional>

struct A {
    std::function<void *(void*)> func;

    A(std::function<void *(void*)> function)
    : func(function)
    {
    }
};

struct B {
    void *real_func(void *);
    A ptr;
    B()
    : ptr(std::bind(&B::real_func,this,std::placeholders::_1))
    {
    }
};