c – const函数指针
我在函数指针方面遇到了一些困难.我有一个基类,它定义了一个函数指针,通过typedef double(* function)(double * x)const;
>一个快速的问题:为什么上面的typedef不能编译? 给出以下错误:错误:’const’和’volatile’函数 对于下面的部分,我使用typedef double(* function)(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); } 编译时我收到以下错误:
我正在使用函数指针,因为速度问题(至少我认为这应该比不断运行某些开关案例更快).我究竟做错了什么?也许还有一些设计模式可以作为更好的选择…提前感谢! 史蒂夫 解决方法
这是因为(自由)函数指针和成员函数指针之间存在根本区别.你的“问题”已经包含了问题的提示.要解释一下,你可以这样做:
typedef double (SomeClass::*function)(double *x) const; 要么 typedef double (*function)(double *x); 但是非成员函数永远不能在函数级别上声明为const.这些类型无法相互转换,这是编译器指出的代码中的问题. 如果它们可以被转换,你最终会遇到一个问题:成员函数指针告诉编译器它需要一个被调用的对象,当调用成员函数时,它将被放入这个对象中.如果指针可以转换为普通函数指针,则该对象将丢失,并且可能所有参数都会因此而混乱.所以,不,你真的不能只是投他们.现实更复杂(多重/虚拟继承),但你得到的图片…… (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |