来自其他 class 的 C++ 成员函数指针
C++ Member Function Pointer From other class
I am creating a console menu in C++ and I want to give every item in my menu a callback function, so when an item is selected, a different function is called.
到目前为止,我有这个代码:
#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) (...)’
当我尝试调用函数时。
我看过很多成员函数指针的实现,但是都是在同一个class.
内使用的
为什么会出现这些错误?
将此代码获取到 compile/work 的正确语法是什么?
谢谢
您将 CoreFunc
声明为非静态 指向成员方法的指针。所以你需要指定一个指向所需方法的指针,例如:
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
class 以跟踪将传递给回调的 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()
示例中就是如此)。
I am creating a console menu in C++ and I want to give every item in my menu a callback function, so when an item is selected, a different function is called. 到目前为止,我有这个代码:
#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) (...)’
当我尝试调用函数时。
我看过很多成员函数指针的实现,但是都是在同一个class.
内使用的为什么会出现这些错误?
将此代码获取到 compile/work 的正确语法是什么?
谢谢
您将 CoreFunc
声明为非静态 指向成员方法的指针。所以你需要指定一个指向所需方法的指针,例如:
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
class 以跟踪将传递给回调的 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()
示例中就是如此)。