常量函数指针

2023-12-09

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

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

    给出以下错误:错误:“const”和“易失性”函数 “function”的说明符在类型声明中无效

对于下面的部分我使用typedef double (*函数)(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 (*)(双倍的*)}'

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

Steve


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

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

or

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

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

常量函数指针 的相关文章

  • 迭代变量并查找特定类型实例的技术

    我想迭代进程中内存中的变量 通过插件动态加载 并查找特定类型的实例 以前我可以找到特定类型 或内存中的所有类型 我可以创建类型的实例 我可以获取作为不同类型的字段包含的实例 但我无论如何都不知道只是 搜索 特定类型的实例 一种方法是使用 W
  • C#动态支持吗?

    看完之后这个帖子 https stackoverflow com questions 2674906 when should one use dynamic keyword in c sharp 4 0k和链接 我还有 2 个问题 问题 1
  • C# 中的接口继承

    我试图解决我在编写应用程序时遇到的相当大的 对我来说 问题 请看这个 为了简单起见 我将尝试缩短代码 我有一个名为的根接口IRepository
  • Clang 编译器 (x86):80 位长双精度

    我正在尝试在 x86 Windows 平台上使用本机 80 位长双精度 海湾合作委员会选项 mlong double 80 https gcc gnu org onlinedocs gcc x86 Options html似乎不适用于 cl
  • 构造函数中显式关键字的使用

    我试图了解 C 中显式关键字的用法 并查看了这个问题C 中的explicit关键字是什么意思 https stackoverflow com questions 121162 但是 那里列出的示例 实际上是前两个答案 对于用法并不是很清楚
  • 访问者和模板化虚拟方法

    在一个典型的实现中Visitor模式 该类必须考虑基类的所有变体 后代 在许多情况下 访问者中的相同方法内容应用于不同的方法 在这种情况下 模板化的虚拟方法是理想的选择 但目前这是不允许的 那么 模板化方法可以用来解析父类的虚方法吗 鉴于
  • 如何从 C# 控制器重定向到外部 url

    我使用 C 控制器作为网络服务 在其中我想将用户重定向到外部网址 我该怎么做 Tried System Web HttpContext Current Response Redirect 但没有成功 使用控制器的重定向 http msdn
  • 如何将“外部模板”与由同一类中的模板化成员使用的嵌套类一起使用?

    首先 一些背景信息 我尝试以 Herb Sutter 在他的解决方案中介绍的方式使用 Pimpl 习语 得到了 101 http herbsutter com gotw 101 这在头文件中看起来像这样 include pimpl h h
  • 如何重置捕获像素的值

    我正在尝试创建一个 C 函数 该函数返回屏幕截图位图中每四个像素的 R G 和 B 值 这是我的代码的一部分 for int ix 4 ix lt 1366 ix ix 4 x x 4 for int iy 3 iy lt 768 iy i
  • 生产代码中的 LRU 实现

    我有一些 C 代码 需要使用 LRU 技术实现缓存替换 目前我知道两种实现LRU缓存替换的方法 每次访问缓存数据时使用时间戳 最后比较替换时的时间戳 使用缓存项的堆栈 如果最近访问过它们 则将它们移动到顶部 因此最后底部将包含 LRU 候选
  • 通过 NHibernate 进行查询,无需 N+1 - 包含示例

    我有一个 N 1 问题 我不知道如何解决它 可以在这个问题的底部找到完全可重复的样本 因此 如果您愿意 请创建数据库 设置 NUnit 测试和所有附带的类 并尝试在本地消除 N 1 这是我遇到的真实问题的匿名版本 众所周知 这段代码对于帮助
  • 获取 2 个数据集 c# 中的差异

    我正在编写一个简短的算法 它必须比较两个数据集 以便可以进一步处理两者之间的差异 我尝试通过合并这两个数据集并将结果更改放入新的数据集来实现此目标 我的方法如下所示 private DataSet ComputateDiff DataSet
  • 尚未处理时调用 Form 的 Invoke 时出现 ObjectDisposeException

    我们得到一个ObjectDisposedException从一个电话到Invoke在尚未处理的表格上 这是一些演示该问题的示例代码 public partial class Form2 Form void Form2 Load object
  • System.Runtime.InteropServices.COMException(0x80040154):[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我在 C 项目中遇到异常 System Runtime InteropServices COMException 0x80040154 检
  • g++ 对于看似不相关的变量“警告:迭代...调用未定义的行为”

    考虑以下代码strange cpp include
  • 耐用功能是否适合大量活动?

    我有一个场景 需要计算 500k 活动 都是小算盘 由于限制 我只能同时计算 30 个 想象一下下面的简单示例 FunctionName Crawl public static async Task
  • 转到定义:“无法导航到插入符号下的符号。”

    这个问题的答案是社区努力 help privileges edit community wiki 编辑现有答案以改进这篇文章 目前不接受新的答案或互动 我今天突然开始在我的项目中遇到一个问题 单击 转到定义 会出现一个奇怪的错误 无法导航到
  • 运算符“==”不能应用于“int”和“string”类型的操作数

    我正在编写一个程序 我想到了一个数字 然后计算机猜测了它 我一边尝试一边测试它 但我不断收到不应该出现的错误 错误是主题标题 我使用 Int Parse 来转换我的字符串 但我不知道为什么会收到错误 我知道它说 不能与整数一起使用 但我在网
  • WinRT 定时注销

    我正在开发一个 WinRT 应用程序 要求之一是应用程序应具有 定时注销 功能 这意味着在任何屏幕上 如果应用程序空闲了 10 分钟 应用程序应该注销并导航回主屏幕 显然 执行此操作的强力方法是在每个页面的每个网格上连接指针按下事件 并在触
  • 匿名结构体作为返回类型

    下面的代码编译得很好VC 19 00 23506 http rextester com GMUP11493 标志 Wall WX Za 与VC 19 10 25109 0 标志 Wall WX Za permissive 这可以在以下位置检

随机推荐

  • 尝试连接到运行 IISExpress 的本地主机时如何解决 ERR_CONNECTION_REFUSED - 错误 502(无法从 Visual Studio 进行调试)?

    它在 Windows Server 2008 上运行 几个月前就可以正常工作 我现在刚刚再次使用这个服务器进行 VS 的一些开发工作 这是一个实时网络服务器 也用于提供一些测试站点 这是在运行 Visual Studio 然后启动我的项目进
  • Netbeans:在 C++ 64 位 Ubuntu 上,导航 -> 转到声明/定义已损坏并显示“无法打开元素”

    我的 Netbeans 右键单击 导航 gt 转到声明 定义已损坏 它拒绝去任何地方 相反 在左下角 会弹出一条消息 无法打开元素 myvariablename 我选择检查的变量或函数对于函数来说是远程的 全局的还是本地的并不重要 从上方菜
  • 将对公共 setter 的访问限制为特定对象 (C#)

    我正在尝试创建一个类 在 C 中 作为我的应用程序的环境 我试图使该类动态化 并将其作为参数发送给我的应用程序中的实体 问题是 我希望能够更改此环境类 公共设置器 的属性 但同时我希望接收环境的类无法使用这些设置器 我似乎找不到一个好的方法
  • 在 MATLAB 中展开矩阵的最快方法是什么?

    如何转矩阵 0 12 0 23 0 34 0 45 0 56 0 67 0 78 0 89 0 90 变成一个有一堆行的 坐标 矩阵 1 1 0 12 1 2 0 23 1 3 0 34 2 1 0 45 2 2 0 56 2 3 0 67
  • jqGrid - 未显示寻呼机。如何启用它?

    我不知道为什么 但我使用 jqGrid 和寻呼机无法正常显示 我可以展示viewrecords 但寻呼机则不然 表的其余部分工作正常 有人可以告诉我问题出在哪里吗 我的 JQGrid 是 jQuery report table jqGrid
  • 如何限制 Git 存储库上的文件夹/文件?

    在 Github 上 如何限制私人存储库上的某些文件夹或文件 我不想让开发人员完全访问存储库中的所有内容 你不能 如果你给某人推送权限 他就可以推送他想要的任何内容 如果您希望某人拥有部分访问权限 您有多种选择 让他分叉并请求存储库 您可以
  • 为什么简单 RMI 服务器需要代码库?

    操作系统 Windows 7JDK 1 8 0 05 我正在学习一些简单的 RMI 教程 包括 Oracle 的 计算 示例 compute 启动我的服务器不需要代码库 并且对与此类似的问题的回答说 代码库是可选的 然而 我的服务器无法注册
  • ROracle 安装:无法加载共享对象错误

    我需要将 R 连接到 Oracle 数据库 按照说明进行操作https cran r project org web packages ROracle INSTALL 准确地说 一步一步 出现以下错误 library ROracle Err
  • CakePHP 3:带有缓存的 find()

    有关get 方法 我读过here 就像查找 get 集成了缓存 调用 get 时可以使用缓存选项来执行读缓存 但后来 在专门介绍find 方法 here 没有提到缓存 没有缓存的例子 cache支持的选项中未提及选项 所以我想知道 我可以使
  • 为什么 equal 运算符和 like 运算符之间的相等比较存在差异?

    SELECT au lname au fname FROM authors WHERE au lname Green au lname au fname Green Marjorie SELECT au lname au fname FRO
  • PHP PDO (MSSQL) 无法获取 OUTPUT 参数

    我正在尝试使用bindParam PHP PDO 获取输出 PHP PDO 库是 FreeTDS for MS SQL 驱动程序 无论我做什么 我似乎都无法按照 php net 上的建议在绑定参数中获得 输出 我已经验证我可以调用 EXEC
  • 在 ggplot 中对齐和排列图表

    我在 ggplot 中有两个图 在我想要对齐的轴上具有相似的范围 Using library grid grid newpage grid draw rbind ggplotGrob g1 ggplotGrob g2 size last w
  • angularJS cookie读取响应值

    如果我使用 http 在我的服务器上发出请求 我将得到以下响应 Request URL http www test tst login Request Method GET Status Code 200 OK Request Header
  • GROUP_CONCAT 编号

    是否可以在 GROUP CONCAT 中进行编号 like 如果 来自 GROUP CONCAT empnam SEPARATOR 我得到一套 lt JohnM DannyP TiffnyK KarlM gt 我需要有 lt 1 JohnM
  • PHP GD库在同一页面上输出图像和文本内容

    我试图将图像输出到浏览器 然后在同一页面上输出 HTML 与图像不直接相关 这可能吗 我花了很长时间才弄清楚 这是我一直在搞乱的代码
  • 自定义类上的 NSData?

    我即将研究 iPhone 上的蓝牙交互 现在 我读到唯一可以传输的对象是 NSData 对象 现在 我想转移我的 角色 对象 这个类看起来像这样 interface Character NSObject
  • C# 文件命名递增名称 001++

    我正在使用 C 创建一个小应用程序 我需要以递归方式命名文件 在创建文件名时递增文件名 我需要以下格式的文件名 alt 001 tmp alt 002 tmp 等 我总是看到 00 在递增的数字之前被删除 例如 001 然后返回 2 而不是
  • .NET MVC 自定义路由

    我想知道是否可以创建一个比控制器更高级别的路由映射 典型的路由将包括 controller action id 我正在寻找类似 section controller action id 或 controller section action
  • 如何拆分 ObservableCollection

    我有 ObservableCollection 有 100 条记录 现在我想将该集合拆分为 10 个新集合 每个新集合有 10 条记录 这意味着 1 个集合 100 条记录 10 个集合 10 条记录 1 个集合 任何帮助将不胜感激 使用
  • 常量函数指针

    我在函数指针方面遇到一些困难 我有一个基类 它定义了一个函数指针 通过typedef double function double x const 一个简单的问题 为什么上面的 typedef 不能编译 给出以下错误 错误 const 和