C++如何通过字符串调用类内的成员函数?
报错根本原因
你定义的void (*pFunc)()是无入参普通函数指针类型,但类的非静态成员函数包含隐式的this指针入参,两者类型不匹配,因此无法直接赋值。
可行实现方案
方案1:成员函数改为静态成员
静态成员函数无隐式this指针,和普通函数指针类型兼容,改动最小:
#include <map> #include <string> #include <iostream> using namespace std; class theClass { public: typedef void (*pFunc)(); map<string, pFunc> strFuncMap; // 改为静态成员函数 static void func1() { printf("this is func1!\n"); } void buildMap() { strFuncMap["func1"] = &func1; } void callFunc(const std::string& str) { (*strFuncMap[str])(); } }; int main() { theClass a; a.buildMap(); a.callFunc("func1"); return 0; }
适用场景:函数不需要访问类的非静态成员。
方案2:使用类成员函数指针
如果函数必须访问类的非静态成员,可以直接声明类成员函数指针类型,调用时绑定类实例:
#include <map> #include <string> #include <iostream> using namespace std; class theClass { public: // 声明类成员函数指针类型 typedef void (theClass::*pFunc)(); map<string, pFunc> strFuncMap; void func1() { printf("this is func1!\n"); } void buildMap() { strFuncMap["func1"] = &theClass::func1; } void callFunc(const std::string& str) { // 绑定当前实例调用成员函数 (this->*strFuncMap[str])(); } }; int main() { theClass a; a.buildMap(); a.callFunc("func1"); return 0; }
适用场景:仅需要调用当前类的非静态成员函数,不需要兼容其他类型函数。
方案3:使用C++11 std::function + std::bind(推荐)
这种方案灵活性最高,兼容静态函数、非静态成员函数、lambda等多种可调用对象,后续扩展成本低:
#include <map> #include <string> #include <iostream> #include <functional> // 新增头文件 using namespace std; class theClass { public: // 用std::function做值类型 map<string, function<void()>> strFuncMap; void func1() { printf("this is func1!\n"); } void buildMap() { // 绑定当前实例到成员函数 strFuncMap["func1"] = bind(&theClass::func1, this); } void callFunc(const std::string& str) { // 直接调用即可 strFuncMap[str](); } }; int main() { theClass a; a.buildMap(); a.callFunc("func1"); return 0; }
内容的提问来源于stack exchange,提问作者Yichao Sun
相关产品推荐
相关产品推荐

