C++ 成员函数指针

2024-02-05

我正在用 C++ 做一个小游戏,我正在发现类成员函数指针。 我不知道如何让它们以正确的方式工作,但这是我的尝试。

// A struct where the function pointer will be stored for the call
// By the way, is there a way to do the same thing with classes ?
// or are structs still fine in C++ ? (Feels like using char instead of string)
typedef struct      s_dEntitySpawn
{
  std::string       name;
  void          (dEntity::*ptr)();
} t_dEntitySpawn;

// Filling the struct, if the entity's classname is "actor_basicnpc",
// then I would like to do a call like ent->spawnBasicNPC
t_dEntitySpawn      dEntitySpawns[] = {
  { "actor_basicnpc", &dEntity::spawnBasicNPC },
  { 0, 0 }
};

// This is where each entity is analyzed
// and where I call the function pointer
void            dEntitiesManager::spawnEntities()
{
  dEntity       *ent;
  t_dEntitySpawn    *spawn;

    [...]

      // It makes an error here, feels very weird for me
      if (!spawn->name.compare(ent->getClassname()))
        ent->*spawn.ptr();

    [...]
}

您能给我关于实施它们的正确方法的好建议吗?

此致。


我认为你正在寻找的线路是

(ent->*(spawn->ptr))();

我们来剖析一下。首先,我们需要获取实际的成员函数指针,即

spawn->ptr

因为,在这里,spawn是一个指针,我们必须使用->选择ptr field.

一旦我们有了这个,我们需要使用指向成员选择运算符来告诉ent选择适当的成员函数:

ent->*(spawn->ptr)

最后,要调用该函数,我们需要告诉 C++ 调用该成员函数。由于 C++ 中的运算符优先级问题,您首先必须将计算结果为成员函数的整个表达式括起来,因此我们有

(ent->*(spawn->ptr))();

无论如何,这是我一段时间以来见过的最奇怪的 C++ 代码行之一。 :-)

在一个完全不相关的注释中,因为您使用的是 C++,所以我会避免使用typedef struct。说啊

struct t_dEntitySpawn {
  std::string name;
  void (dEntity::*ptr)();
};

希望这可以帮助!

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

C++ 成员函数指针 的相关文章

随机推荐

  • ms-access:当我将扩展名更改为 ACCDR 时,表单/表格消失

    我想向某些人分发一个访问前端 并且我想确保他们不会编辑其中的任何内容 但是 当我将扩展名更改为 ACCDR 时 它会使所有表单和表格消失 我必须更改哪些设置才能使他们能够打开表单但不能在设计视图中查看它们或对表单进行任何更改 accdr 扩
  • 如何将 Regexp.last_match 传递给 Ruby 中的块

    有什么办法可以通过最后一场比赛 几乎Regexp last match 到 Ruby 中的块 迭代器 这是一个示例方法 作为一种包装器Srring sub来演示问题 它接受标准参数和块 def newsub str rest bloc st
  • JQuery UI 在 Scripts.Render 之后无法在 MVC 4 中工作?

    不确定这里出了什么问题 我已经阅读了一些其他解决方案并尝试使用它们 但似乎没有任何效果 我想做的就是渲染一个日期选择器 我以前已经做过很多次了 只是不确定我是否有大脑故障 因为过去几周我一直处于 关键 时间 或者什么 我有最新的 JQuer
  • Autoit 3 通用按键

    似乎应该有一个通用的按键监听器 如下所示 hotkeysset listener func listener key msgbox 0 Key You pressed key endfunc while true sleep 100 wen
  • WebAPI 帮助页面 - 返回或参数模型/类属性的文档

    我正在使用 Web API 帮助页面和 Web API 2 5 0 都是最新的 Nuget 包 我希望帮助文档显示作为参数或在 HttpResponseMessage 正文中返回的类的属性的注释 例如 我有一个像这样的控制器方法 publi
  • 让gulp动态地将css写入与处理后的scss文件相同的目录中

    我希望编写 gulpfile js 扫描主题目录中的 style scss 文件 其想法是读取 style scss 文件并在同一目录中写入相应的 style css 和 min 文件 我遇到的问题是 在不确切知道目录是什么的情况下 我找不
  • 如何检查字符串是否仅包含拉丁字符?

    如何检查字符串是否包含 a zA Z 仅限字符 Example var str 123z56 不需要 jQuery if str match a z i alphabet letters found
  • 多维数组填充

    我正在尝试填充多维数组中的一个区域 但不确定该方法 例如我有以下数组 var map 0 0 0 0 0 0 0 0 0 0 2 2 2 2 2 2 0 0 0 2 0 0 0 0 2 0 0 0 2 0 2 0 0 2 0 0 0 2 0
  • Eclipse 2020-06 Javascript - 语法突出显示不起作用

    将我的 Eclipse IDE 更新到实际的 2020 06 版本后 JavaScript 的语法突出显示不再起作用 这是一个已知 常见问题吗 我该如何解决这个问题 在花了大半天的时间研究它 包括安装 Eclipse PDT 的新实例 后
  • 在受限用户帐户 XP 中运行时,C# 应用程序无法读取/写入管理员创建的文件

    我有一个可供所有用户 管理员或受限用户 在 NET 特别是 C 中使用的应用程序 当应用程序首次启动时 它会在 C Documents and Settings All Users Documents 中创建一些后续启动所需的文件 如果 X
  • 是否有用于生成 MOBI 电子书文档的 Java 或 Ruby 库? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 Calibre 项目中有一个用于此目的的 Python 库 但我想找到一个可以从 Clojure 或 Ruby 使用的库 有任何想法吗 查
  • 生成图像并将其与其他内容一起显示在 JSP 中

    我正在使用 JFreeChart 根据用户输入生成动态图表 我有一个带有一些文本框和组合框的 JSP 用户输入并提交它 操作处理它 生成图表图像 我需要在文本框 组合框下方的同一个 JSP 上显示此图像 如果我使用response setC
  • 构建 VITE 应用程序时如何分配自定义 CSS 文件名?

    是否可以在VITE中构建并使用application name css or my site name css VITE 可以选择构建自定义 JS 文件 但不能构建自定义 CSS 或 SCSS 文件 用于导出 https vitejs de
  • 如何在 XCassets 中使用立方体纹理类型

    我正在尝试学习 SceneKit 开发并尝试在后台添加天空盒 为了存储立方体贴图纹理 我发现 XCAssets 有一个类型立方体纹理集 https developer apple com library archive documentat
  • 单向 SSL 是单向加密吗?

    如果使用 SSL 的一种方式 服务器证书身份验证 则从客户端发送的数据将使用服务器证书的公钥进行加密 因此客户端发送的数据可以得到隐私保护 我的问题是 这是否意味着从服务器发送到客户端的一种方式 SSL 数据未加密并以纯文本形式发送 对于服
  • JSF 中的线程?

    我是 JSF 新手 我需要使用 Threads 来处理 google 地图 我正在使用 primefaces 进行谷歌地图 但我需要在后台执行一个线程以从数据库获取纬度和经度 然后在地图中绘制标记 您的问题并非特定于 JSF 而是针对一般的
  • Facebook 页面插件无法正常工作

    我需要一个嵌入式 Facebook 页面插件 但是facebook的代码生成器不起作用 当我给出 facebook 页面的 url 时 生成器不会给出该页面的代码 预览模式下也不会出现该页面 脸书页面是 https www facebook
  • PE格式,IAT目录有什么用

    在 PE 格式中 我们有导入表目录 通过IMAGE DIRECTORY ENTRY IMPORT 和 IAT 目录 通过以下方式访问 IMAGE DIRECTORY ENTRY IAT 两者都是可选标头数据目录的一部分 使用导入表 加载器动
  • memcpy 溢出边界利用? (破坏堆栈)

    我试图弄清楚这是否会以某种方式溢出 void print address char p arp hw int i hw length size p OFFSET1 189 4 193 memcpy hw addr packet OFFSET
  • C++ 成员函数指针

    我正在用 C 做一个小游戏 我正在发现类成员函数指针 我不知道如何让它们以正确的方式工作 但这是我的尝试 A struct where the function pointer will be stored for the call By