c++ - const 函数指针

标签 c++ function pointers

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

  • 一个简单的附带问题:为什么上面的 typedef 不能编译?

    给出以下错误:error: ‘const’ and ‘volatile’ function “函数”的说明符在类型声明中无效

对于下面的部分,我使用了 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);
}

编译时出现以下错误:

note: no known conversion for argument 1 from ‘double (PndLmdROOTDataModel1D::*)(double*)’ to ‘function {aka double (*)(double*)}’

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

史蒂夫

最佳答案

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

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

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

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

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

关于c++ - const 函数指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15506094/

相关文章:

c++ - 为什么是 BGRA 而不是 RGBA?

c++ - 当向 CURLOPT_DNS_SERVERS 提供错误 ip 时,Curl 返回全部正常

r - "If"、 "else"、 "is.na()"在 R 的一个函数中的用法

android - 避免代码重复 - 如何在 gradle 中创建函数(并调用它们)?

c - 简单链表构建代码说明

c++ - 如何将几乎任何东西传递给 C++(或 C)中的函数?

c++ - Microsoft C++ 预定义宏

c++ - Ubuntu 14.04 - Qt 版本选择

c - 用 C 语言编写程序,使用函数显示偶数和奇数自然数的 n 项及其和

c++ - 如何使用新运算符 C++ 为 void 指针分配内存?