加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – const函数指针

发布时间:2020-12-16 10:40:34 所属栏目:百科 来源:网络整理
导读:我在函数指针方面遇到了一些困难.我有一个基类,它定义了一个函数指针,通过typedef double(* function)(double * x)const; 一个快速的问题:为什么上面的typedef不能编译? 给出以下错误:错误:’const’和’volatile’函数 ‘function’上的说明符在类型声
我在函数指针方面遇到了一些困难.我有一个基类,它定义了一个函数指针,通过typedef double(* function)(double * x)const;

>一个快速的问题:为什么上面的typedef不能编译?

给出以下错误:错误:’const’和’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*)}’

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

史蒂夫

解决方法

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

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

要么

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

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读