2009-11-16 6 views
0

Je travaille avec une classe héritage qui ressemble à ceci:Séparation des énumérations de définitions de classe en utilisant des espaces de noms en C++?

class A 
{ 
    enum Flags { One = 1, Two = 2 }; 
}; 

Je voudrais retirer tous les énumérations dans un nouvel espace de nom défini dans un nouvel en-tête:

// flags.h 

namespace flags { 

enum Flags { One = 1, Two = 2 }; 

}; 

Ensuite, tirer ces énumérations de nouveau dans la classe afin que je puisse inclure juste le flags.h des en-têtes qui ne nécessitent que ces valeurs (plutôt que toute la définition de la classe):

// a.h 

#include "flags.h" 

class A 
{ 
    using namespace flags; 
}; 

Comment dois-je faire cela?

+1

Pouvez-vous préciser ce qui fonctionne et ne fonctionne pas pour vous, et comment vous voulez l'utiliser dans le code? Pourquoi ne pas mettre les enums dans une superclasse? –

Répondre

2

Une directive using est illégale dans la portée de classe. Au lieu d'un espace de noms, vous pouvez définir une classe, puis en hériter:

struct flags { 
    enum Flags { One=1, Two=2 }; 
}; 

class A : public flags { ... }; 

Mais cela ressemble à une mauvaise utilisation de l'héritage pour moi, pour être honnête. Comme alternative, vous pouvez mordre la balle et utiliser un espace de noms sans « importer » les noms dans la classe A.

+2

Mordre la balle est la meilleure option, bien que je préfère encore l'encapsulation 'struct' que' l'espace de noms ', car struct ne pas interagir avec les templates dans un espace de noms de manière. –

+0

Comment l'espace de noms de style struct peut-il être un avantage avec les templates? Comme on le voit la structure vous permet juste deux façons de faire la même chose. modèle à partir de l'espace de noms struct ou du type enum. Alors qu'une utilisation plus standard de l'espace de noms n'en permet qu'une seule. Plus de façons de faire la même chose est seulement désiré en écrivant perl. –

0
class F { 
    enum Flags { One = 1, Two = 2 }; 
}; 


class A : public F { 
}; 
+0

Mauvais usage de l'héritage repéré ... pourriez-vous au moins donner des constructeurs et des destructeurs F protégés? –

1

Vous ne pouvez pas les rendre tous visibles dans une classe sans tirer les valeurs par using déclarations séparement.

La meilleure chose, à mon avis, que vous pouvez faire est de les emballer dans une classe qui ne contient rien d'autre. De cette façon, vous pouvez les rendre visibles dans une autre classe en dérivant de la classe qui tient les énumérations:

struct Holder { 
    enum E { a }; 
protected: 
    Holder() {} 
    ~Holder() {} 
}; 

class User : public Holder 
{ 
public: 
    void f() { /* a is visible here */ } 
}; 

void f() { /* User::a is visible here */ } 
+0

Mauvais usage de l'héritage repéré ... pourriez-vous au moins donner des constructeurs et des destructeurs F protégés? –

+0

Vous voulez dire "Titulaire"? Point pris. –

Questions connexes