1

我正在尝试做一些这样的事情:

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++ 禁止使用不合格或带括号的非静态成员函数的地址来形成指向成员函数的指针。

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

谢谢!

卡洛斯

4

2 回答 2

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() {
        // ...
    }
};
于 2013-06-11T04:18:22.953 回答
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))
    {
    }
};
于 2013-06-11T03:13:02.720 回答