C++ 成员函数指针

标签 c++ class pointers pointer-to-member

我正在用 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字段。

一旦我们有了它,我们需要使用指向成员选择的指针操作符来告诉 ent 选择合适的成员函数:

ent->*(spawn->ptr)

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

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

就其值(value)而言,这是我一段时间以来看到的最奇怪的 C++ 代码行之一。 :-)

完全不相关的一点是,因为您使用的是 C++,所以我会避免使用 typedef struct。就说

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

希望这对您有所帮助!

关于C++ 成员函数指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9188521/

相关文章:

java - 如何在lambda表达式(JAVA)中使用try catch?

c++ - 关于 C++ 中构造函数(和多重继承)的一些基本问题?

类型转换,C编程

javascript - 将 Javascript 正则表达式模式转换为 C++ std::regex 的规则?

c++ - 两个元组的编译时集减法

c++ - 对象创建的外包

java - 在运行时运行 Java 文件

c++ - 处理夏令时 - C++

c++ - "Warning : No return statement in function returning non-void"是什么意思?

c++ - 指向失去值(value)的对象的 vector 的指针