指向多个类的指针

时间:2011-08-09 07:56:09

标签: c++ pointers

我正在开发一款游戏。有一个“玩家”类和一个“NPC”类。

这些类的每个实例都可以有一个“目标”。该目标可以是另一个玩家或另一个NPC。我希望这个“目标”值指向播放器/ NPC选择的播放器/ NPC的实例。

所以问题是,在我目前的设置中,每个玩家/ NPC都有2个指针:

Player* target_p;
NPC* target_n;

这显然不是最佳的。我问的是,是否有办法制作一个可以指向这些类中的任何一个的指针,而不只是一个。

提前致谢。

6 个答案:

答案 0 :(得分:3)

您可以为PlayerNPC创建公共基类。这个基类可以有PlayerNPC的公共字段,或者只是空(但应该有虚拟析构函数),然后你可以存储该类型的指针。

class Target
{
public:
    virtual ~Target(){}
};

class Player : public Target
{
    ...
};

class NPC : public Target
{
    ...
};

答案 1 :(得分:3)

您可以创建一个TargetablePlayer继承的基类NPC,然后使用Targetable*类型的指针。

答案 2 :(得分:2)

如果它们确实有一些通用接口,您可以创建基类。也许是这样的:

class Target { /* common interface, like a method both Player and NPC use */ };
class Player : public Target { ... };
class NPC    : public Target { ... };

如果您没有通用界面,则不应使用此界面。然后你必须重新考虑你的设计。

答案 3 :(得分:0)

您应该通过从基类派生类PlayerNPC来使用继承,例如GameCharacter(其中可能来自GameObject或者其他任何内容)。然后你可以宣布一个目标:GameCharacter* target;

答案 4 :(得分:0)

  1. 使用继承,从其他人建议的单个基类派生这两个类。
  2. 声明union指向这两个类的指针。
  3. 使用void*
  4. 使用C风格或reinterpret_cast将一个类转换为另一个类类型。

答案 5 :(得分:0)

啊啊啊!

我也正在编写​​游戏,我自己做了一些构思。

使用继承是一种好方法,但具有“可定位”基类的答案并不是最佳的。显然,“角色”和“非玩家角色”的共同点(继承)不是“可定位”属性,而是整个“角色”:(树是为了继承)

  • 字符:
    • 非玩家角色
    • 玩家角色

如果您考虑一下,“可定位”属性不仅限于字符。这给了我们:

  • 互动的东西:(可定位,但也有尺寸,重量等)
    • 被动或无生命=对象,工件(您可能想要定位对象)
      • 门(例如砸门)
      • 雕像
    • 主动或动画=通常是生物
      • 小怪(可以打架,但不与玩家说话)
      • 字符(附加功能,如说话)
        • 非玩家角色
        • 玩家角色

当然这是一个非常粗略的概念,但你明白了。我的意思是如果你不想一次又一次地重新实现它,你最好做纸张设计。

祝你好运!