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 .hpp
enum_defn
mais qu'en est-il de la classe de base?
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
Vous avez cassé le [ODR] (http://en.wikipedia.org/wiki/One_Definition_Rule) (règle de définition unique). – Jarod42
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. –