4

私は大規模なコードベースを維持しており、前方宣言とpImplイディオムの組み合わせを使用して、コンパイル時間を短縮し、依存関係を減らしています(そしてそれは本当にうまく機能します)

私が抱えている問題は、パブリック列挙を含むクラスにあります。これらの列挙は前方宣言できないため、クラスヘッダーを含める以外に選択肢はありません。例えば:

// Foo.h

class Foo
{
public:
  enum Type
  {
    TYPE_A,
    TYPE_B,
  };
  ...
};

// Bar.h

#include "Foo.h" // For Foo::Type

class Bar
{
public:
  void someFunction(Foo::Type type);
  ...
};

だから、私はこれを回避する方法を探しており、次のことしか考えられません:

クラス列挙を別の「types」名前空間に移動します

// FooTypes.h

namespace FooTypes
{
  enum Type
  {
    TYPE_A,
    TYPE_B,
  };
}

// Bar.h

#include "FooTypes.h"

class Bar
{
public:
  void someFunction(FooTypes::Type type);
  ...
};

列挙の代わりにintを使用する

// Bar.h

class Bar
{
public:
  void someFunction(int type);
  ...
};

私は何を逃しましたか?他の人はこの制限をどのように回避しますか(列挙を前方宣言することはできません)。

4

3 に答える 3

3

PIMPL を含むクラスに列挙を配置します。

于 2009-12-07T18:14:33.510 に答える
2

列挙型を独自の型に入れます。

struct FooEnum
{
  enum Type
  {
    TYPE_A,
    TYPE_B,
  };
};

次にFooBar両方にアクセスでき、含める必要はFooEnum::TypeありBar.hませんFoo.h

于 2009-12-07T18:32:24.873 に答える
0

列挙型は最初から悪い考えであると主張しますが、一般的に、定数/ C++の定数のような多くのものはどれもまったく定数ではなく、すべてに問題があります。私はそれを構造体に入れ、それを使用するクラスに構造体から継承させるのが好きです。

私はまた、ピンプルのイディオムが悪いと主張したいと思います. 実際、私はそれが物事を行うための悪い方法だと確信しています。それは機能しますが、ぎこちなく、少しばかげています。また、回避するのは簡単であり、それが発生する唯一の理由は、人々がさらに他の悪い設計を選択したためです.

通常、誰かが具体的に設計されたクラスに OOP を追加するだけです。次に、混合継承のケースと、コンパイル時間が非常に遅いなど、それが引き起こす多くの問題が発生します。代わりに、純粋な仮想基本クラスを検討し、それにライブラリを記述して、テンプレートを回避し、前方宣言の問題を回避します。すべてではありませんが、多くのクラスのコードを生成している場合には間違いありません。

于 2009-12-08T01:12:54.123 に答える