2015-04-07 1 views
0

J'ai donc une classe de base A qui a ces fonctions:Donner un accès superclasse aux types enum qui n'ont pas encore été défini

virtual void DoSomething(SomeNameSpace1::EnumID ID) = 0; 
virtual void DoSomething(SomeNameSpace2::EnumID ID) = 0; 
virtual void DoSomething(SomeNameSpace3::EnumID ID) = 0; 

J'ai aussi 2 classes dérivées B et C qui définissent la façon dont ces fonctions fonctionnent . La façon dont SomeNameSpace1::EnumID, SomeNameSpace2::EnumID et SomeNameSpace3::EnumID sont définies dépend de si elle est utilisée ou non dans la classe B ou dans la classe C. Ainsi, j'ai deux fichiers:

enum_defn_B.hpp:

namespace SomeNameSpace1 { 

enum EnumID { 

    ENUM_TYPE_1 = 0 , 
    ENUM_TYPE_2 
} 

namespace SomeNameSpace2 { 

enum EnumID { 

    ENUM_TYPE_3 = 0 , 
    ENUM_TYPE_4 
} 

namespace SomeNameSpace3 { 

enum EnumID { 

    ENUM_TYPE_5 = 0 , 
    ENUM_TYPE_6 
} 

enum_defn_C.hpp:

namespace SomeNameSpace1 { 

enum EnumID { 

    ENUM_TYPE_7 = 0 , 
    ENUM_TYPE_8 
} 

namespace SomeNameSpace2 { 

enum EnumID { 

    ENUM_TYPE_9 = 0 , 
    ENUM_TYPE_10 
} 

namespace SomeNameSpace3 { 

enum EnumID { 

    ENUM_TYPE_11 = 0 , 
    ENUM_TYPE_12 
} 

Le problème que j'ai maintenant que la classe de base A ne reconnaît pas le type SomeNameSpace1::EnumID , SomeNameSpace2::EnumID ou SomeNameSpace3::EnumID. Il ne serait également pas logique d'inclure les fichiers enum_defn_b.hpp ou enum_defn_c.hpp car ils sont spécifiques aux deux classes dérivées. Que puis-je faire dans ce cas? J'ai lu des trucs sur les déclarations avancées, mais je ne savais pas si c'était la bonne méthode.

Dans les classes dérivées j'inclurais chacun de leurs fichiers .hppenum_defn mais qu'en est-il de la classe de base?

+0

Votre conception est erronée - une fonction virtuelle ne peut pas être remplacée par une fonction avec une signature différente. Si la fonction de base prend une énumération et qu'une fonction dérivée utilise une autre énumération, la substitution n'aura pas lieu. – eran

+0

Vous avez cassé le [ODR] (http://en.wikipedia.org/wiki/One_Definition_Rule) (règle de définition unique). – Jarod42

+0

Je suis d'accord avec Eran et Jarod42. De ma compréhension, vous cherchez une interface de base commune pour différents types de services, qu'en est-il de l'utilisation des foncteurs? http://www.cprogramming.com/tutorial/functors-function-objects-in-c++.html, par ex. supprimez vos énumérations avec une hiérarchie de classe. Un indice pour corriger le mauvais design. –

Répondre

0

Essayez-vous d'utiliser un comportement polymorphe causé par des valeurs différentes? Un inverseur n'est-il pas plus approprié? Cela peut être fait aussi avec des modèles, mais ceux-ci sont un pretty advanced topics.

Quoi qu'il en soit, peut-être cette explication vous donnera quelques idées:

1) Si vous souhaitez utiliser un type, il doit être déclaré avant l'utilisation.

2) Les classes dérivées doivent inclure la déclaration de la classe de base, et implicitement la définition des énumérations.

3) Si chaque fichier de classe dérivé définissait ses énumérations avec des noms déjà existants d'une manière différente, cela nuirait à l'un des concepts de base de C++: definition rule.

0

A devrait avoir un sens indépendamment du fait que des Bs ou C en soient dérivés ou non. Que devrait penser A SomeNameSpaceX autre que cela ne semble pas exister?