結果だけでなく過程も見てください

たい焼きさんの日々の奮闘を綴る日記です。

enumの宣言方法でもんもん


以下のようにenum型を宣言している場合。

enum CharacterType
{
  eUnknown=0,
  ePlayer,
  eEnemy,
  eItem
};


switch文などで利用するときは以下のようにすると思います。

switch( type )
{
case eUnknown: ... break;
case ePlayer: ... break;
case eEnemy: ... break;
case eItem: ... break;
}


が、これだと他のenumでePlayerやeEnemyを宣言しようとすると
シンボルが再定義されたとしてエラーになってしまいます。


ePlayerやeEnemyを他で定義しなければいいと言われればそれまでですが、
僕の場合、enumの最初の列挙子は必ずeUnknownにしたいのです。
そしてeUnknownをそのenum型のデフォルト値として使いたいので、
死活問題なのです(笑)


そこで、自分の場合は名前空間でそれぞれのenum宣言を分けて上記の問題を
解決してます。

namespace CharacterInfo
{
  enum CharacterType
  {
    eUnknown=0,
    ePlayer,
    eEnemy,
    eItem
  };
}

namespace CollisionInfo
{
  enum CollisionType
  {
    eUnknown=0,
    ePlayer,
    eEnemy,
  };
}


使うときは

CharacterInfo::CharacterType type;

 …

switch ( type )
{
case CharacterInfo::ePlayer: ... break;
case CharacterInfo::eEnemy: ... break;
}


僕の場合はさらにenum型の名前はすべてTypeにしています。
名前空間名がすでに型の意味を表しているので)

namespace Character
{
  enum Type
  {
    ...
  }
}

namespace Collision
{
  enum Type
  {
     ...
  }
}

この方法ってどうなんでしょうか?^^;
(ここまで読んでもらった後ですいません)


僕はずっとこのやり方でコーディングしていますが、未だに
イレギュラーな方法なのかどうか知りません^^;


もっとスマートなやり方を知っている方いましたら
ぜひ教えていただきたいです><


ちなみに上記の宣言方法で、さらに外側に名前空間を宣言している場合

namespace GameSystem
{
  namespace Character{ ... }
  namespace Collision{ ... }
}


名前がやたらと長ったらしくなってしまうのでCharacterやCollisionまでの
名前空間をusing namespaceするとスッキリします。

using namespace GameSystem;
Character::Type eCharaType;


しかし、できれば型として「Character::Type」を使いたいですよね…。
以下のようにusingを使うと

using GameSystem::Character::Type;


enum型の宣言は「Character::Type」としては宣言できず
以下のように宣言するしかなくなります。
これではもともと他のePlayerやeEnemyとぶつかってしまう問題に
逆戻りすることになります^^;

Type eCharaType;


とまぁ、色々と使いにくい部分もあり、何かもっといい方法がある気がして
毎日もんもんとしてます(笑)