web-dev-qa-db-ja.com

enumクラスはどこに置くべきですか?

次のようなコードがあります。

// 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 };

あなたの意見では、これらのデザインの長所と短所は何ですか?

7
Ignorant

型をクラス/構造体に入れる主な理由は、テンプレートのメタプログラミングのため、または型がクラスに対してプライベートである場合です。それ以外の場合は、クラスの横に配置します。

// Player.hpp
...

enum class PlayerState { RUN, WALK, STAND };

class Player {
public:
  ...
private:
   PlayerState m_state;
};

C++では、クラスのヘルパー宣言がいくつかあるのが一般的です。したがって、ヘッダーポリシーごとに1つの宣言を強制することは妥当ではありません。

PlayerStatePlayerとは別に使用されている場合、この宣言を別のファイルに入れるのが賢明です。しかし、これらの名前を考えると、そうなる可能性は低いです。

一部の宣言で追加のヘッダーをヘッダーに含める必要がある場合は、個別のヘッダーが特に役立ちます。 C++(現在)にはモジュールシステムがないため、これらのヘッダーの内容は、作成中のヘッダーを含むすべてのユーザーが利用できるようになり、影響を最小限に抑えたいと考えています。これらのヘッダー依存関係の代替ソリューションは、クラス定義の詳細を抽象化することです。ポリモーフィズムを使用する(ヘッダーはインターフェースのみを宣言するが、実装クラスは.cppファイルの内部にある)、またはpImplイディオムを使用する。

8
amon

これは、名前空間が必要な場合に似ています。 C++では、関連する名前をグループ化するための自然な方法です。

名前空間は、クラスとは異なり、再度開くことができます。つまり、複数のヘッダーをすべて同じ名前空間に追加することができます。 namespace stdに寄与するすべてのヘッダーを見てください

3
MSalters