Const函数指针
const function pointers
我对函数指针有一些困难。我有一个基类,它定义了一个函数指针,通过typedef double (*function)(double *x) const;
-
一个快速的侧面问题:为什么上面的类型定义不编译?
错误:' 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);
}
编译时,我得到以下错误:
注意:参数1与' double '没有已知的转换(PndLmdROOTDataModel1D::*)(double*) ' to '函数{也就是double(*)(双*)}'
我正在使用函数指针,因为速度问题(至少我认为这应该比不断运行一些开关情况更快)。我做错了什么?也许还有一些设计模式可以作为更好的选择……提前感谢!
史蒂夫这是因为(自由)函数指针和成员函数指针之间存在根本的区别。你的"附带问题"已经包含了问题的提示。要进行解释,您可以这样做:
typedef double (SomeClass::*function)(double *x) const;
或
typedef double (*function)(double *x);
但是非成员函数永远不能在函数级别声明为const
。这些类型不能相互转换,这是编译器在你的代码中指出的问题。
如果它们可以转换,就会出现一个问题:成员函数指针告诉编译器需要调用一个对象,该对象将在调用成员函数时放入this
中。如果可以将指针强制转换为普通函数指针,则该对象将丢失,并且可能导致所有参数混乱。所以,不,你真的不能直接选演员。实际情况甚至更复杂(多重/虚拟继承),但是您可以了解到……
出于同样的原因,我们不应该写:
void foo() const
{
// ...
}
在类声明之外。非成员函数不能为const
你的函数指针是一个普通的函数指针,而不是指向成员函数的指针,因此,const
在那里没有意义。
- 如何正确编写指针函数声明?
- C++常规指针函数或模板
- 如何重新定义 C++ 指针函数?
- C++ 指向其他类函数的指针函数
- 指针到指针函数参数
- 将指向成员的指针函数传递到模板中
- C++ 在 none 常量指针函数中返回一个常量指针
- 如何使用指针函数编写/读取数组
- 是C 中的函数指针函数对象
- 如何从另一个类调用指向成员的指针函数
- 如何声明采用指向成员的指针函数的函数
- 如何构造一个以可变参数指针函数作为成员的类?
- c 通过值或指针函数语法
- 将typedef方法作为指针函数传递
- 从 Main 中的双指针函数打印出指针数组
- strcpy 对指针函数的引用
- 这是否仍然声明一种指针函数的别名?
- 将指向成员的指针函数与 std::shared_ptr 结合使用
- 'Incomplete type' 为标准::函数声明指向成员的指针函数模板参数时出错
- 从注入进程的 DLL 调用函数并更改指针函数的地址