我在函数指针方面遇到一些困难。我有一个基类,它定义了一个函数指针,通过typedef double (*function)(double *x) const;
对于下面的部分我使用typedef double (*函数)(double *x)。
现在,每个子类都可以实现该类型函数的多个不同版本。通过枚举,我选择了我选择的函数,它将我的非成员函数指针(在基类中定义)设置为由子类的这些成员函数指针之一进行初始化。这是一个代码片段:
子类的源文件:
PndLmdROOTDataModel1D::PndLmdROOTDataModel1D(interpolation_type intpol_type) {
if(intpol_type == CONSTANT) {
setModelFunction(&PndLmdROOTDataModel1D::evaluateConstant);
}
else if (intpol_type == SPLINE) {
setModelFunction(&PndLmdROOTDataModel1D::evaluateSpline);
}
else {
setModelFunction(&PndLmdROOTDataModel1D::evaluateLinear);
}
}
和基类(头文件):
class MultiModel1D: public Model1D {
protected:
function model_func;
public:
MultiModel1D();
virtual ~MultiModel1D();
void setModelFunction(function f);
}
编译时我收到以下错误:
注意:没有已知的参数 1 从“double”的转换
(PndLmdROOTDataModel1D::*)(double*)’ 到 ‘function {aka double
(*)(双倍的*)}'
由于速度问题,我正在使用函数指针(至少我认为这应该比不断运行某些 switch case 更快)。我究竟做错了什么?也许还有一些设计模式可以作为更好的选择......提前致谢!
Steve
这是因为(自由)函数指针和成员函数指针之间存在根本区别。您的“附带问题”已经包含了问题的提示。为了解释一下,你可以这样做:
typedef double (SomeClass::*function)(double *x) const;
or
typedef double (*function)(double *x);
但永远不能声明非成员函数const
在功能层面上。这些类型不能相互转换,这是编译器指出的代码中的问题。
If they could如果被转换,你最终会遇到一个问题:成员函数指针告诉编译器它需要一个对象来调用,该对象将被放入this
当调用成员函数时。如果指针可以转换为普通函数指针,则该对象将丢失,并且可能所有参数都会因此而混乱。所以,不,你真的不能只是投射它们。现实情况甚至更复杂(多重/虚拟继承),但你明白了......
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)