为何无法在类B中使用类Foo的成员函数指针?
问题分析与修复方案
核心错误点
- “最令人头疼的解析”陷阱:B类中
Foo obj();是声明了一个返回Foo类型的无参成员函数,而非定义Foo类型的成员变量。 - 成员指针访问错误:
ptrToFunc是Foo类的成员变量,必须通过Foo对象(obj)访问,直接写ptrToFunc会被视为未声明标识符。 - 指针调用语法错误:成员函数指针的调用必须遵循
(对象.*成员函数指针)()的语法,需明确通过对象获取指针,并通过括号保证运算符优先级。
修复后的完整代码
class Foo { public: double (Foo::*ptrToFunc)(); private: double func1() { return 1.0; } // 补充函数实现,避免链接报错 double func2() { return 2.0; } public: Foo() : ptrToFunc{&Foo::func1} {} }; // 补充类定义结束的分号 class B { public: Foo obj; // 修正为成员变量定义,而非函数声明 double countVal() { // 正确调用:通过obj访问ptrToFunc,再按成员函数指针语法调用 return (obj.*obj.ptrToFunc)(); } }; // 补充类定义结束的分号 int main() { B obj_B; double var = obj_B.countVal(); return 0; }
关键细节说明
- 修正成员变量声明:将
Foo obj();改为Foo obj;,避免编译器误解析为函数声明。 - 指针访问方式:必须通过
obj.ptrToFunc获取Foo对象中的成员函数指针,不能直接使用ptrToFunc。 - 运算符优先级:
.*的优先级低于(),因此必须用括号包裹obj.*obj.ptrToFunc,确保先完成指针绑定再执行函数调用。 - 函数实现补充:原代码中
func1和func2只有声明无实现,会导致链接阶段报错,因此补充了简单的返回值实现。
内容的提问来源于stack exchange,提问作者Vadim Shestak
相关产品推荐
相关产品推荐

