C++友元类调用成员函数指针编译失败问题求助
问题分析与解决办法
错误原因
classB的Compute方法里直接使用cp是错误的:cp是classA的私有成员变量,它属于classA的实例a,必须通过a来访问这个成员。直接写cp时,编译器会认为这是classB的成员或全局变量,找不到对应标识符就会抛出编译错误。
解决办法
修改Compute方法,通过a.cp获取成员函数指针后再调用:
class classB { public: void Compute(int x, int y) { (a.*(a.cp))(x, y); } private: classA a; };
如果追求可读性,可以先把成员指针赋值给局部变量:
class classB { public: void Compute(int x, int y) { classA::ComputeMethod method = a.cp; (a.*method)(x, y); } private: classA a; };
完整修正代码
class classA { public: classA() { // 补充condition的初始化示例 bool condition = true; if (condition) { cp = &classA::Add; } else { cp = &classA::Mul; } } private: typedef int (classA::*ComputeMethod)(int x, int y); int Add(int x, int y) { return x+y; } int Mul(int x, int y) { return x*y; } ComputeMethod cp; friend class classB; }; class classB { public: void Compute(int x, int y) { (a.*(a.cp))(x, y); } private: classA a; };
注:原代码中condition未初始化,实际编译时也会报错,建议补充初始化逻辑。
内容的提问来源于stack exchange,提问作者Ray
相关产品推荐
相关产品推荐

