2010-02-10 13 views
16

Ho codice simile al seguente:Forward dichiarazione di enum nidificato

class B 
{ 
} 

class A 
{ 
    enum { 
    EOne, 
    ETwo 
    } EMyEnum; 

    B myB; 
} 

voglio dichiarare un membro di tipo EMyEnum in classe B (che è dichiarato prima di A). È possibile? Mi rendo conto che la soluzione è dichiarare la seconda classe B, ma per chiarezza preferirei non farlo.

+0

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

risposta

11

Non è possibile ... ma può essere simulato con l'abuso di eredità :)

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; 
}; 

D'altra parte ... perché non è sufficiente dichiarare avanti 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 }; 

Certo è necessario scrivere in realtà tutto il "default generato" normalmente i metodi di A, ma hey che non costa tanto!

+1

Sì, il secondo era quello che ho finito per fare. Dovevo solo confermare che la mia preferenza non era possibile :) –

+0

Che cosa significa "enum {} EMyEnum"? Non l'ho mai incontrato prima? – Olumide

+0

@Olumide: contiene due nits strani ereditati da C. Innanzitutto, in C è possibile creare immediatamente un'istanza di 'struct' o' enum': 'struct X {int x; } myX; 'dichiara una variabile' myX' di tipo 'X'. Secondo, in C puoi lasciare il nome 'struct' o' enum' e quindi creare un tipo anonimo. È spesso usato su enum per dichiarare le costanti in C: 'enum {CONSTANT_A = 12, CONSTANT_B = 42};' ma può anche essere combinato con il primo nit per creare una variabile di un tipo anonimo. Ovviamente, nel particolare contesto di questa domanda, questo probabilmente non è ciò che è inteso ... –

2

L'attuale standard C++ non consente dichiarazioni in avanti di enum s, sebbene arriveranno nel prossimo standard C++ 0x.

Vedere here per ulteriori informazioni.

0

È possibile dichiarare A come parametro modello di B. Il secondo modo per risolverlo è utilizzare int - è noto che C++ enum è int.

+0

È noto solo in C, in C++ corrente, ogni tipo intero potrebbe essere emesso da il compilatore. –

+0

@phresnel hai ragione, ma intendo che potrebbe comunque essere castato per int – Dewfy