17

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

class B
{
}

class A
{
  enum {
     EOne,
     ETwo
  } EMyEnum;

  B myB;
}

クラス B (A の前に宣言されている) で型 EMyEnum のメンバーを宣言したい。これは可能ですか?解決策はクラス B を 2 番目に宣言することだと思いますが、わかりやすくするために、そうしないことをお勧めします。

4

3 に答える 3

11

それは不可能です...しかし、相続の乱用で偽造される可能性があります:)

namespace detail
{
  class A_EMyEnum
  {
  public:
    enum {
       EOne,
       ETwo
    } EMyEnum;

  protected:
    A_EMyEnum() {}
    A_EMyEnum(const A_EMyEnum&) {}
    A_EMyEnum& operator=(const A_EMyEnum&) { return *this; }
    ~A_EMyEnum() {}
  }; // class A_EMyEnum
} // namespace detail

class B { // use detail::A_EMyEnum };

class A: public detail::A_EMyEnum
{

  B mB;
};

一方、...単にBを前方宣言してみませんか?

class B;

class A
{
public:
  enum EMyEnum {};

  A();
  A(const A&);
  A& operator=(const A&);
  ~A();
  void swap(A&);

private:
  B* mB;
};

class B { // use A::EMyEnum };

確かに、通常は「デフォルトで生成される」Aのメソッドをすべて実際に作成する必要がありますが、それほどコストはかかりません。

于 2010-02-11T13:54:29.983 に答える
2

現在の C++ 標準では、s の前方宣言は許可されていませんがenum、今後の C++0x 標準では導入される予定です。

詳細については、こちらを参照してください。

于 2010-02-10T15:54:44.460 に答える
0

A を B のテンプレート パラメーターとして宣言できます。それを解決する 2 番目の方法は、int を使用することです。C++ 列挙型は int であることがわかっています。

于 2010-02-10T15:57:27.610 に答える