設計(2)

namespace 周りのことを考えてみる。


namespace は、グローバル名前空間を汚さないので、非常に便利だ。
なので、LunaCat は全て "LunaCat" という namespace で囲んでやることにする。
で、さらにその上から、機能別に namespace を使う。

// Object.h
namespace LunaCat{
namespace core{

class Object{
};

} // core
} // LunaCat

で、もし別の namespace からこのクラスを使う場合には、

// Hoge.h
namespace LunaCat{
namespace Hoge{

class Hoge : public LunaCat::core::Object{
};

} // Hoge
} // LunaCat

ちょっとクラスを継承するだけで、こんな長い名前になる。
なぜかというと、ヘッダで using namespace をすると、LunaCat を使う側にも影響してくるからだ。
stdafx.h で using namespace をしても、使う側が名前を解決出来ないのでどうしようもない。とりあえずこれは、諦めて長い名前を書くことにする。


あと、どうやら typedef についても namespace で囲めるみたいなので、これもそうすることにする。

namespace LunaCat{
namespace type{

typedef unsigned int    uint32;
typedef int             int32;
...

} // type
} // LunaCat

こうすれば、自分で typedef をしたときにいらないエラーを出すこともないだろう。


ただ、LunaCat を作る際に、単に uint32 とヘッダに書くだけだと、LunaCat を使う側が名前を解決出来ないのでエラーになる。
これも pImpl パターンを使えば解決出来るのだけど、考えてみれば、今回はそのパターンを使う必要はない。