C++ 成员函数指针组成的动态数组调用语法问题
C++成员函数指针调用错误修复方案
错误根因
你存储的demoFunc是类成员函数指针,和普通函数指针逻辑不同:成员函数运行时依赖隐含的this指针,调用时必须绑定具体的类实例,直接调用成员函数指针会因缺少实例上下文触发类型不匹配错误。
修复方法
修改InvokeFunction中的调用代码,使用C++成员函数指针专用调用运算符->*绑定当前类的this实例,同时因运算符优先级问题需要额外加括号包裹实例绑定部分:
// 把原来的报错行替换为以下代码 bool result = (this->*container.func)(0);
完整可运行修正代码
class TestClass { public: typedef bool (TestClass::* demoFunc)(int); struct Container { Container(demoFunc func) : func(func) {} demoFunc func; }; Container* containers; bool foo1(int dummy) { return true; } bool foo2(int dummy) { return true; } void InvokeFunction(int i) { TestClass::Container container = containers[i]; // 修正后的调用代码 bool result = (this->*container.func)(0); } }; int main() { TestClass testClass; testClass.containers = new TestClass::Container[] { TestClass::Container(&TestClass::foo1), TestClass::Container(&TestClass::foo2), }; testClass.InvokeFunction(0); testClass.InvokeFunction(1); // 补充内存释放逻辑,避免泄漏 delete[] testClass.containers; return 0; }
注意事项
- 成员函数指针调用运算符
.*(用于类实例)、->*(用于类指针)的优先级低于函数调用运算符(),必须用括号把实例和指针的绑定部分整体包裹,否则会触发语法错误 - 动态申请的数组使用完成后需要调用
delete[]释放内存,避免资源泄漏
内容的提问来源于stack exchange,提问作者Wernfried
相关产品推荐
相关产品推荐

