如何调用返回类方法指针的类方法?链接错误及调用问题咨询
解决类方法指针的链接错误与调用问题
首先,你的链接错误根源很明确——源文件里定义a方法时没有加上类作用域限定符A::,编译器把它当成了全局函数,而头文件里声明的是类A的成员函数,自然会出现"undefined reference"的问题。下面一步步帮你解决:
第一步:修正a方法的定义,解决链接错误
把源文件里的a方法定义改成这样,必须明确标注它是类A的成员函数:
void (A::*A::a(const std::string& name))() const { // 这里填充你的funcMap初始化逻辑,举个例子: const std::map<const std::string, void (A::*)() const> funcMap = { {"func1", &A::func1}, {"func2", &A::func2} }; auto it = funcMap.find(name); if (it != funcMap.end()) { return it->second; } // 找不到匹配时可以返回默认函数,或者根据需求做错误处理 return &A::func1; }
第二步:正确调用A::a获取方法指针
因为a是类A的非静态成员函数,你必须通过A的对象(或指针/引用)来调用它,语法要注意成员函数指针的特殊性:
A obj; // 获取成员函数指针 void (A::*funcPtr)() const = obj.a("func1"); // 通过对象调用这个指针 (obj.*funcPtr)(); // 如果用指针调用的话: A* ptr = &obj; (ptr->*funcPtr)();
这里的括号不能少——.和->的优先级比*高,必须用括号保证先解析成员函数指针,再调用。
第三步:在doSomething里调用拿到的方法指针
在类的成员函数内部,直接用this指针来调用成员函数指针即可:
void A::doSomething() { // 先通过a方法拿到目标函数指针 auto funcPtr = this->a("func2"); // 调用这个函数指针 (this->*funcPtr)(); // 如果是直接用funcMap里的it->second,写法是一样的: // (this->*it->second)(); }
可选优化:简化成员函数指针的类型
成员函数指针的语法太繁琐,你可以用using定义别名来简化代码,让可读性更高:
在头文件里修改:
class A { public: // 如果需要外部调用a方法,记得把成员改成public,或者用友元 using MemFuncPtr = void (A::*)() const; MemFuncPtr a(const std::string& name); void func1() const; void func2() const; void doSomething(); };
然后源文件里的a方法定义就可以写成:
A::MemFuncPtr A::a(const std::string& name) { const std::map<const std::string, MemFuncPtr> funcMap = { {"func1", &A::func1}, {"func2", &A::func2} }; auto it = funcMap.find(name); return it != funcMap.end() ? it->second : &A::func1; }
内容的提问来源于stack exchange,提问作者TMoore
相关产品推荐
相关产品推荐

