設計(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 パターンを使えば解決出来るのだけど、考えてみれば、今回はそのパターンを使う必要はない。