У меня есть код, подобный следующему:
class B
{
}
class A
{
enum {
EOne,
ETwo
} EMyEnum;
B myB;
}
Я хочу объявить члена типа EMyEnum в классе B (который объявляется прежде A). Действительно ли это возможно? Я понимаю, что решение состоит в том, чтобы объявить второй класс B, но для ясности я предпочел бы не.
Это невозможно... но это можно подделать с помощью злоупотребления наследованием :)
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 ++ не допускает форвардных объявлений enum
s, хотя они появятся в грядущем стандарте C ++ 0x .
См. здесь для получения дополнительной информации.
Вы можете объявить A параметром шаблона B. Второй способ его решения - использовать int - известно, что c++ enum - это int.