2010-02-10 24 views
16

que tiene un código similar al siguiente:declaración adelantada de enumeración anidada

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 que 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.

+0

superconjunto http://stackoverflow.com/questions/951234/forward-declaration-of-nested-types-classes-in-c –

Respuesta

11

No es posible ... pero puede ser falsificada con el abuso de la 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é no simplemente declara adelante 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 se necesita para escribir en realidad toda la "omisión generado" normalmente métodos de A, pero bueno que no cuesta tanto!

+1

Sí, esto último fue lo que terminé haciendo. Solo necesitaba confirmar que mi preferencia no era posible :) –

+0

¿Qué significa 'enum {} EMyEnum'? Nunca me he encontrado antes? – Olumide

+0

@Olumide: contiene dos liendres raras heredadas de C. Primero, en C puedes crear una instancia inmediata de una estructura o estructura enum: struct X {int x; } myX; 'declara una variable' myX' de tipo 'X'. Segundo, en C puedes dejar el nombre 'struct' o 'enum' y así crear un tipo anónimo. A menudo se usa en 'enum' para declarar constantes en C:' enum {CONSTANT_A = 12, CONSTANT_B = 42}; 'pero también se puede combinar con el primer nit para crear una variable de tipo anónimo. Obviamente, en el contexto particular de esta pregunta, probablemente esto no sea lo que se pretende ... –

2

El estándar actual de C++ no permite las declaraciones avanzadas de enum s, aunque vendrán en el próximo estándar C++ 0x.

Consulte here para obtener más información.

0

Puede declarar A como plantilla paramater de B. La segunda forma de resolverlo es usando int - se sabe que C++ enum es int.

+0

Se conoce solo en C, en C++ actual, todos los tipos enteros pueden ser emitidos por el compilador –

+0

@phresnel tienes razón, pero quiero decir que de todos modos podría ser cambiado a int – Dewfy

Cuestiones relacionadas