c++ - lenguaje - estructuras anidadas pdf
Adelante declaraciĆ³n de enumeraciĆ³n anidada (3)
El estándar actual de C ++ no permite las declaraciones de enum
adelante, aunque vendrán en el próximo estándar de C ++ 0x.
Vea here para más información.
Tengo un código similar al siguiente:
class B
{
}
class A
{
enum {
EOne,
ETwo
} EMyEnum;
B myB;
}
Quiero declarar un miembro de tipo EMyEnum en la clase B (que se declara antes de A). es posible? Me doy cuenta de que la solución es declarar la clase B en segundo lugar, pero para mayor claridad, preferiría no hacerlo.
No es posible ... pero puede ser falsificado con abuso de herencia :)
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;
};
Por otro lado ... ¿por qué simplemente no reenvían declarar 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 };
Claro que necesitas escribir todos los métodos normalmente generados por defecto de A, ¡pero no cuesta tanto!
Puede declarar A como parámetro de plantilla de B. La segunda forma de resolverlo es usar int: se sabe que c ++ enum es int.