gpt4 book ai didi

来自其他类的 C++ 成员函数指针

转载 作者:行者123 更新时间:2023-11-30 03:56:37 25 4
gpt4 key购买 nike

我正在用 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) (...)’

当我尝试调用该函数时。

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

为什么会出现这些错误?

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

谢谢

最佳答案

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

addOption(&Core::action1);

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

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 对象作为 execOptionX() 的参数,例如:

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() 中执行)示例)。

关于来自其他类的 C++ 成员函数指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28390797/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com