2009-10-25 3 views
0

Ce code donne error C2504: 'IKeyEvent': base class undefined sur la ligne 3.dépendance circulaire irrécupérable

class IKeyEvent; 

class EventDispatcher : private IKeyEvent { 
public: 
    enum EEActions { 
     A_FEW_ACTIONS 
    }; 
private: 
    void OnKey(EventDispatcher::EEActions action, char multiplier); 
} 

class IKeyEvent { 
public: 
    virtual void OnKey(EventDispatcher::EEActions action, char multiplier) = 0; 
}; 

Vous ne pouvez pas hériter d'une classe jusqu'à ce qu'il soit défini, compréhensible. Mais je ne peux pas définir IKeyEvent jusqu'à aprèsEventDispatcher est défini.

Je sais que je peux déplacer cette enum hors de la définition Event Dispatcher pour la rendre globale mais cela nécessiterait de refactoriser une grande partie du programme. Est-il possible d'avoir EventDispatcher hériter d'une classe dépendante de EventDispatcher?

+2

'Unfixable' est correct. – SLaks

+0

Une classe de base qui nécessite un type déclaré dans une classe dérivée? Fondamentalement, quelque chose ne va pas dans ce design OO? –

+1

@Murali: apparemment, c'est "juste" un problème de refactoring; IKeyEvent est ajouté maintenant, alors que EventDispatcher existe. Je ne pense pas qu'il soit fondamentalement mauvais d'ajouter des interfaces au fur et à mesure. –

Répondre

5

Ma recommandation: déplacer EEActions dans la classe de base - il est partie de l'interface, après tout:

class IKeyEvent { 
public: 
    enum EEActions { 
     A_FEW_ACTIONS 
    }; 
    virtual void OnKey(EEActions action, char multiplier) = 0; 
}; 

class EventDispatcher : public IKeyEvent { 
private: 
    void OnKey(EventDispatcher::EEActions action, char multiplier); 
}; 

Si vous faites ensuite aussi l'héritage du public IKeyEvent, vous pouvez continuer à se référer à l'énumération EventDispatcher::EEActions (bien que l'énumération soit définie dans le type de base).

Questions connexes