能否根据条件动态修改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&)'
问题
如何解决该问题,实现根据条件动态切换类成员函数的功能?
解决方法
你的代码存在几个关键错误,修正后即可实现需求:
修正成员函数指针的类型声明
类的非静态成员函数指针和普通函数指针类型不同,必须明确标注所属类。把void (*modifier)(int&)改为void (SomeClass::*modifier)(int&),这才是SomeClass类成员函数指针的正确类型。修正构造函数与指针初始化
原代码构造函数写法错误,且成员函数指针初始化时必须取函数地址。把SomeClass ;改为SomeClass() : modifier(&SomeClass::m1) {},利用初始化列表完成指针的初始化(类内部可以访问private成员,所以直接取m1的地址是合法的)。修正changer函数中的赋值语句
给成员函数指针赋值时,同样需要取成员函数的地址,不能直接写函数名。把modifier=m1;改为modifier=&SomeClass::m1;,m2同理改为&SomeClass::m2。调用成员函数指针的正确方式
如果后续需要调用这个指针,必须绑定类的实例,写法为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
相关产品推荐
相关产品推荐

