C++类默认构造函数中如何将已定义函数赋值给函数指针成员
问题根因
报错的核心原因是SHOPotential是OneDSystem类的非静态成员函数,非静态成员函数会隐式携带一个this指针作为第一个参数,所以它的实际签名和你声明的普通函数指针double (*potential)(double, double)不匹配,自然无法完成赋值。
你编写的带参构造函数传入的是外部普通函数,签名完全匹配,所以运行正常。
解决方法
方案1:将SHOPotential改为类静态成员函数(最便捷)
静态成员函数不会隐式携带this参数,签名和你声明的函数指针完全匹配,修改方式如下:
- 修改头文件中
SHOPotential的声明,添加static关键字:
class OneDSystem { private: double (*potential)(double, double); OneDParticle Particle; double MAXPOS, MAXVEL; // 新增static修饰符 static double SHOPotential(double mass, double position); // other methods public: OneDSystem(); OneDSystem(const OneDParticle Particle, double (*potential)(double,double)); };
- cpp文件中的
SHOPotential实现不需要额外加static,你原有实现可以直接保留,默认构造函数里的&SHOPotential赋值逻辑也不需要调整,修改后即可正常运行。
方案2:修改函数指针类型为类成员函数指针(不推荐)
如果你确实需要保留SHOPotential为非静态成员函数,需要把成员变量potential的类型改为类成员函数指针,同时调用时需要绑定当前实例的this指针,修改成本较高:
// 头文件中修改指针类型声明 double (OneDSystem::*potential)(double, double);
赋值时调整为:
this->potential = &OneDSystem::SHOPotential;
调用时需要使用成员函数指针的专用语法:
double res = (this->*potential)(mass, pos);
方案3:使用std::function做类型擦除(扩展性更强)
如果后续需要兼容lambda、带捕获的函数对象等场景,可以把potential的类型替换为std::function<double(double, double)>,不需要修改SHOPotential的静态属性,用std::bind绑定this即可使用,需要先引入<functional>头文件。
内容的提问来源于stack exchange,提问作者Adam Kalinowski
相关产品推荐
相关产品推荐

