次のようなコードがあります。
class B
{
}
class A
{
enum {
EOne,
ETwo
} EMyEnum;
B myB;
}
クラス B (A の前に宣言されている) で型 EMyEnum のメンバーを宣言したい。これは可能ですか?解決策はクラス B を 2 番目に宣言することだと思いますが、わかりやすくするために、そうしないことをお勧めします。
次のようなコードがあります。
class B
{
}
class A
{
enum {
EOne,
ETwo
} EMyEnum;
B myB;
}
クラス B (A の前に宣言されている) で型 EMyEnum のメンバーを宣言したい。これは可能ですか?解決策はクラス B を 2 番目に宣言することだと思いますが、わかりやすくするために、そうしないことをお勧めします。
それは不可能です...しかし、相続の乱用で偽造される可能性があります:)
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のメソッドをすべて実際に作成する必要がありますが、それほどコストはかかりません。
現在の C++ 標準では、s の前方宣言は許可されていませんがenum
、今後の C++0x 標準では導入される予定です。
詳細については、こちらを参照してください。
A を B のテンプレート パラメーターとして宣言できます。それを解決する 2 番目の方法は、int を使用することです。C++ 列挙型は int であることがわかっています。