【问题标题】:enums in different classes are incompatible?不同类中的枚举不兼容?
【发布时间】:2014-02-17 17:36:08
【问题描述】:

所以我正在制作一个游戏,我有一个 Player 类,它有一个枚举玩家当前面向的方向、向上、向左等。

Player.h
#include "Fireball.h"
class Player
{
   // Some stuff
   Fireball fireballs;
   void update();

   private:
   enum direction {up, left, down, right, upLeft, upRight, downLeft, downRight} playerDir;
};

我还有一个 Spell 类,我将从中派生特定的法术,例如 Fireball。 Spell 类有一个与 Player 类中的枚举相同的枚举,因为我希望能够在更新咒语实例时将玩家的当前方向作为参数传递,并在其中移动咒语方向。

Spell.h
class Spell
{
// Some stuff

protected:
   enum direction {up, left, down, right, upLeft, upRight, downLeft, downRight};
};

.

Fireball.h
#include "Spell.h"
class Fireball : public Spell
{
public:
   void updateFireballs(direction fireballDir);
};

.

Player.cpp
#include "Player.h"

void Player::update()
{
   fireballs.updateFireballs(playerDir);
}

当我尝试将 playerDir 作为参数传递给 updateFireballs 函数时,它抱怨它无法将“Player::direction”转换为“Spell::direction”。

如何将来自不同类的枚举作为不同类中函数的参数传递?

【问题讨论】:

  • 为什么要在两个类中定义单独的枚举,尤其是如果您想互换使用它们时?在两个类之外有一个共同的定义会更有意义。
  • 即使你在 Player 类之外定义了direction,在里面你仍然可以说using direction = ::direction; 使Player::direction 成为全局direction 的同义词。但也许你有类似class Map 的东西——方向通常属于地图。

标签: c++ inheritance enums


【解决方案1】:

每个枚举都是它自己的类型。当您在不同的类中定义两个枚举时,您定义了两种类型。它们可能具有相同的成员名称,但它们是不相关的。

当您需要一个通用枚举时,请定义一个。如果你发现这个枚举会有名字冲突,你应该为它定义一种“容器”。这可以是 PlayerSpell 类的命名空间或基类。

【讨论】:

    【解决方案2】:

    不要在不相关的类中两次声明枚举类。您可以在类之外定义它。如果您仍然希望它在 Spell 类下,请将其公开,以便其他类可以看到它。

    class Spell
    {
    public:
        enum Direction {up, left, down, right, upLeft, upRight, downLeft, downRight};
    };
    
    class Fireball : public Spell
    {
    public:
        void updateFireballs(Spell::Direction fireballDir);
    };
    
    class Player
    {
        Fireball fireballs;
        void update()
        {
            fireballs.updateFireballs(playerDir);
        }
    private:
        Spell::Direction playerDir;
    };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-28
      相关资源
      最近更新 更多