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;
とまぁ、色々と使いにくい部分もあり、何かもっといい方法がある気がして
毎日もんもんとしてます(笑)