【问题标题】:function pointer to a class member指向类成员的函数指针
【发布时间】:2013-06-06 19:38:28
【问题描述】:

我正在尝试这样做:

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++ 禁止获取不合格或 带括号的非静态成员函数以形成指向成员的指针 功能。

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

谢谢!

卡洛斯

【问题讨论】:

标签: c++ function member


【解决方案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() {
        // ...
    }
};

【讨论】:

    【解决方案2】:

    你可以这样创建 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))
        {
        }
    };
    

    【讨论】:

    • 但是我的函数不能是静态的!初始化列表中只能关联静态函数?
    • @user2472980:只有静态函数可以像普通函数一样工作。
    • 那么......我如何获得与期望类似的行为?
    • @user2472980:我在答案中添加了更多内容。
    • 不适合我。我使用 gcc 4.6(gentoo 的 portage 上的最新稳定版本)。
    猜你喜欢
    • 2017-07-27
    • 1970-01-01
    • 2015-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多