You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 02:09:04