web-dev-qa-db-ja.com

C ++名前空間と個別のファイルでのクラスの定義

「パッケージ」の一部としていくつかのクラスを含む名前空間を作りたいです。

名前空間内のすべてのクラスを宣言する必要がありますか?

たとえば、2dEngineネームスペースを定義する「2dEngine.h」がある場合、そのヘッダーファイル内の個々のクラスをすべて宣言する必要がありますか?それとも、それらを別々のヘッダー(.h)ファイルに分離して、名前空間の一部にすることはできますか?

疑似例:

TwoEngine.h

namespace TwoEngine
{
    class Canvas
    {
        // Define all of Canvas here
    };

    class Primitive
    {
        // Define all of Primitive here
    };
}

そうする代わりに、CanvasとPrimitiveを独自の.hファイルにして、どういうわけかそれらがその名前空間の一部であると述べたいと思います。

申し訳ありませんが、私はまだこれからかなり新しいです。

35
guitar-

はい、名前空間を複数のブロック(したがってファイル)に分割できます。 namespaceブロックで同じ名前で宣言されている限り、クラスは同じ名前空間に属します。

// Canvas.h
namespace TwoEngine
{
    class Canvas
    {
        // Define all of Canvas here
    };
}

// Primitive.h
namespace TwoEngine
{
    class Primitive
    {
        // Define all of Primitive here
    };
}
39
Alex B

名前空間は不連続にすることができます。クライアントコードで使用され、ライブラリの一部として出荷される2DEngine.hに関連クラスを保持することで、これを利用できます。

それ以外の場合、外部に公開されないものは同じ名前空間に配置できますが、別のヘッダーファイル(出荷されません)に配置できます。

ヘッダーH1.h(外部世界へのライブラリインターフェイスの一部)

namespace TwoEngine 
{ 
    class Canvas 
    { 
        // Define all of Canvas here 
    }; 
}

ヘッダーH2.h(外部世界へのライブラリインターフェイスの一部ではない)

#include "H1.h"
namespace TwoEngine      // reopen the namespace and extend it
{
    class Primitive 
    { 
        // Define all of Primitive here 
    }; 
}
7
Chubsdad

はい、実装ファイル内でも名前空間ディレクティブを使用してください。

0
Preet Sangha