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

能否根据条件动态修改C++类成员函数?编译报错求助

C++类中动态切换成员函数的编译错误解决

原代码

class SomeClass
  public:
    SomeClass ;
    void (*modifier)(int&) {m1};
  private:
    void m1(int& i) {i++;}
    void m2(int& i) {i--;}
    void changer (bool condition) {
      if(condition) {
        modifier=m1;
      } else {
        modifier=m2;
      }
    }

编译错误

error: cannot convert 'SomeClass::m1' from type 'void (SomeClass::)(int&)' to type 'void (SomeClass::*)(int&)'

问题

如何解决该问题,实现根据条件动态切换类成员函数的功能?


解决方法

你的代码存在几个关键错误,修正后即可实现需求:

  1. 修正成员函数指针的类型声明
    类的非静态成员函数指针和普通函数指针类型不同,必须明确标注所属类。把void (*modifier)(int&)改为void (SomeClass::*modifier)(int&),这才是SomeClass类成员函数指针的正确类型。

  2. 修正构造函数与指针初始化
    原代码构造函数写法错误,且成员函数指针初始化时必须取函数地址。把SomeClass ;改为SomeClass() : modifier(&SomeClass::m1) {},利用初始化列表完成指针的初始化(类内部可以访问private成员,所以直接取m1的地址是合法的)。

  3. 修正changer函数中的赋值语句
    给成员函数指针赋值时,同样需要取成员函数的地址,不能直接写函数名。把modifier=m1;改为modifier=&SomeClass::m1;,m2同理改为&SomeClass::m2。

  4. 调用成员函数指针的正确方式
    如果后续需要调用这个指针,必须绑定类的实例,写法为this->*modifier(i)或者(*this).*modifier(i)。

修正后的完整代码

class SomeClass
{
public:
    // 构造函数初始化成员函数指针
    SomeClass() : modifier(&SomeClass::m1) {}
    
    // 正确声明类成员函数指针
    void (SomeClass::*modifier)(int&);

    // 示例:调用指针指向的函数
    void applyModifier(int& i) {
        (this->*modifier)(i);
    }

private:
    void m1(int& i) {i++;}
    void m2(int& i) {i--;}
    
    void changer(bool condition) {
        if(condition) {
            modifier = &SomeClass::m1;
        } else {
            modifier = &SomeClass::m2;
        }
    }
};

内容的提问来源于stack exchange,提问作者Copych

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 19:59:52