2010-02-10 4 views
16

imbriqué J'ai un code similaire à ce qui suit:déclaration avant de ENUM

class B 
{ 
} 

class A 
{ 
    enum { 
    EOne, 
    ETwo 
    } EMyEnum; 

    B myB; 
} 

Je veux déclarer un membre de type EMyEnum en classe B (qui est déclarée avant A). Est-ce possible? Je me rends compte que la solution est de déclarer la classe B en second lieu, mais par souci de clarté, je préférerais ne pas le faire.

+0

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

Répondre

11

Il est impossible ... mais il peut être truqué avec l'abus d'héritage :)

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'autre part ... pourquoi ne pas simplement déclarer avant 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 }; 

Bien sûr, vous avez besoin d'écrire effectivement tous les « généré par défaut » normalement méthodes A, mais bon qui ne coûte pas tant!

+1

Oui, ce dernier était ce que j'ai fini par faire. Juste besoin de confirmer que ma préférence n'était pas possible :) –

+0

Que signifie 'enum {} EMyEnum'? Je ne l'ai jamais rencontré auparavant? – Olumide

+0

@Olumide: Il contient deux nits bizarres hérités de C. Premièrement, en C, vous pouvez immédiatement instancier un 'struct' ou' enum': 'struct X {int x; } myX; 'déclare une variable' myX' de type 'X'. Deuxièmement, en C, vous pouvez laisser le nom 'struct' ou' enum' et ainsi créer un type anonyme. Il est souvent utilisé sur 'enum' pour déclarer des constantes dans C:' enum {CONSTANT_A = 12, CONSTANT_B = 42}; 'mais peut aussi être combiné avec le premier nit pour créer une variable d'un type anonyme. Évidemment, dans le contexte particulier de cette question, ce n'est probablement pas ce qui est prévu ... –

2

La norme C++ actuelle n'autorise pas les déclarations directes de enum, bien qu'elles soient fournies dans le prochain standard C++ 0x. Pour plus d'informations, voir here.

0

Vous pouvez déclarer A comme paramètre de modèle de B. La deuxième façon de le résoudre est d'utiliser int - il est connu que C++ enum est int.

+0

Il est seulement connu en C, en C++ courant, tout type entier peut être émis par le compilateur. –

+0

@phresnel vous avez raison, mais je veux dire que de toute façon il pourrait être casté à int – Dewfy

Questions connexes