4

我对函数指针有一些困难。我有一个基类,它定义了一个函数指针,通过typedef double (*function)(double *x) const;

  • 一个小问题:为什么上面的 typedef 不能编译?

    给出以下错误:错误:'function'上的'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*)' 到 'function {aka double (*)(double*)}'的转换</p>

由于速度问题,我正在使用函数指针(至少我认为这应该比不断运行某些开关盒更快)。我究竟做错了什么?也许还有一些设计模式可以作为更好的选择......提前致谢!

史蒂夫

4

2 回答 2

15

这是因为(自由)函数指针和成员函数指针之间存在根本区别。您的“附带问题”已经包含问题的提示。为了解释,您可以执行以下任一操作:

typedef double (SomeClass::*function)(double *x) const;

或者

typedef double (*function)(double *x);

const但是永远不能在函数级别声明非成员函数。这些类型不能相互转换,这是编译器指出的代码中的问题。

如果它们可以转换,你最终会遇到一个问题:成员函数指针告诉编译器它需要一个要调用的对象,该对象将在调用成员函数时放入this。如果可以将指针转换为普通函数指针,则该对象将丢失,并且可能所有参数都会因此而混乱。所以,不,你真的不能只施放它们。现实更加复杂(多重/虚拟继承),但你明白了......

于 2013-03-19T17:15:12.843 回答
8

出于同样的原因,我们不会写:

void foo() const
{
   // ...
}

在类声明之外。非成员函数不能是const.

您的函数指针是普通函数指针,而不是指向成员函数的指针,因此在const那里没有任何意义。

于 2013-03-19T17:15:17.853 回答