resueltos lenguaje funciones estructuras ejercicios decisiones arreglo anidadas c++ enums nested forward-declaration

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.