【问题标题】:C++ Member Function Pointer From other class来自其他类的 C++ 成员函数指针
【发布时间】:2015-02-08 05:09:32
【问题描述】:

我正在用 C++ 创建一个控制台菜单,我想给菜单中的每个项目一个回调函数,所以当一个项目被选中时,会调用一个不同的函数。 到目前为止,我有这个代码:

#include <iostream>
#include <vector>

using namespace std;

class Core
{
    public:

    void action1() {}

    void action2() {}
    //...
};

typedef void (Core::*CoreFunc)();

class Menu
{
    struct Option
    {
        Option(CoreFunc cb) : callback(cb) {}
        //some data
        CoreFunc callback;
        //some more data
    };

    vector<Option> m_options;

    public:

    Menu(Core const& core)
    {
        addOption(core.action1);
    }

    void addOption(CoreFunc callback)
    {
        m_options.push_back(Option(callback));
    }

    void execOptionX(int index)
    {
        m_options[index].callback();
    }
};

int main()
{
    Core core;

    Menu menu(core);

    menu.execOptionX(0);

    return 0;
}

这给了我这个错误:

no matching function for call to ‘Menu::addOption(<unresolved overloaded function type>)’

addOption(core.action1);

还有

must use ‘.*’ or ‘->*’ to call pointer-to-member function in ‘((Menu*)this)->Menu::m_options.std::vector<_Tp, _Alloc>::operator[]<Menu::Option, std::allocator<Menu::Option> >(((std::vector<Menu::Option>::size_type)index)).Menu::Option::callback (...)’, e.g. ‘(... ->* ((Menu*)this)->Menu::m_options.std::vector<_Tp, _Alloc>::operator[]<Menu::Option, std::allocator<Menu::Option> >(((std::vector<Menu::Option>::size_type)index)).Menu::Option::callback) (...)’

当我尝试调用该函数时。

我见过很多成员函数指针的实现,但都是在同一个类中使用的。

为什么会出现这些错误?

让这段代码编译/工作的正确语法是什么?

谢谢

【问题讨论】:

    标签: c++ function pointers member pointer-to-member


    【解决方案1】:

    您将CoreFunc 声明为非静态指向成员方法的指针。所以你需要指定一个指向所需方法的指针,例如:

    addOption(&Core::action1);
    

    更重要的是,您还需要提供一个Core 对象实例作为回调的this 参数。您可以通过.* 运算符(如果使用对象引用)或-&gt;* 运算符(如果使用对象指针)指定对象,例如:

    void execOptionX(int index)
    {
        CoreFunc callback = m_options[index].callback;
        (SomeCoreObj.*callback)();
    }
    

    void execOptionX(int index)
    {
        CoreFunc callback = m_options[index].callback;
        (SomeCoreObjPtr->*callback)();
    }
    

    因此,您需要更改 Menu 类以跟踪将传递给回调的 Core 对象(假设您不想将 Core 对象作为参数传递给 @987654332 @,例如:

    class Menu
    {
        struct Option
        {
            Option(CoreFunc cb) : callback(cb) {}
            //some data
            CoreFunc callback;
            //some more data
        };
    
        Core &m_core;
        vector<Option> m_options;
    
    public:
    
        Menu(Core &core)
            : m_core(core)
        {
            addOption(&Core::action1);
        }
    
        void addOption(CoreFunc callback)
        {
            m_options.push_back(Option(callback));
        }
    
        void execOptionX(int index)
        {
            CoreFunc callback = m_options[index].callback;
            (m_core.*callback)();
        }
    };
    

    当然,Core 对象必须在 Menu 的生命周期内保持活动状态(在您的 main() 示例中就是这样做的)。

    【讨论】:

    • 好的,我将Core &amp;m_core 添加到我的Menu 课程并更正了addOption(&amp;Core::action1);。但是,当我执行m_core.*callback(); 时,我仍然收到错误must use ‘.*’ or ‘-&gt;*’ to call pointer-to-member function in ‘callback (...)’, e.g. ‘(... -&gt;* callback) (...)’
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-02
    • 1970-01-01
    • 2018-09-12
    • 1970-01-01
    • 2012-02-29
    • 1970-01-01
    • 2011-12-09
    相关资源
    最近更新 更多