次のようなコードがあります。
// Player.hpp
class Player
{
public: enum class State { RUN, WALK, STAND };
};
EnumクラスState
は、Playerクラスだけでなく、他の多くの外部コンポーネントによって使用されます。このように、Player::State
定義を必要とする他のすべてのコンポーネントには、Player.hppファイルを含める必要があります。私はこの解決策について100%確信が持てません。
別のオプションは、次のように、別の「types.hpp」ファイルに状態を配置することです。
// types.hpp
enum class PlayerState { RUN, WALK, STAND };
あなたの意見では、これらのデザインの長所と短所は何ですか?
型をクラス/構造体に入れる主な理由は、テンプレートのメタプログラミングのため、または型がクラスに対してプライベートである場合です。それ以外の場合は、クラスの横に配置します。
// Player.hpp
...
enum class PlayerState { RUN, WALK, STAND };
class Player {
public:
...
private:
PlayerState m_state;
};
C++では、クラスのヘルパー宣言がいくつかあるのが一般的です。したがって、ヘッダーポリシーごとに1つの宣言を強制することは妥当ではありません。
PlayerState
がPlayer
とは別に使用されている場合、この宣言を別のファイルに入れるのが賢明です。しかし、これらの名前を考えると、そうなる可能性は低いです。
一部の宣言で追加のヘッダーをヘッダーに含める必要がある場合は、個別のヘッダーが特に役立ちます。 C++(現在)にはモジュールシステムがないため、これらのヘッダーの内容は、作成中のヘッダーを含むすべてのユーザーが利用できるようになり、影響を最小限に抑えたいと考えています。これらのヘッダー依存関係の代替ソリューションは、クラス定義の詳細を抽象化することです。ポリモーフィズムを使用する(ヘッダーはインターフェースのみを宣言するが、実装クラスは.cppファイルの内部にある)、またはpImplイディオムを使用する。
これは、名前空間が必要な場合に似ています。 C++では、関連する名前をグループ化するための自然な方法です。
名前空間は、クラスとは異なり、再度開くことができます。つまり、複数のヘッダーをすべて同じ名前空間に追加することができます。 namespace std
に寄与するすべてのヘッダーを見てください