2009-10-25 72 views
0

該代碼給出了error C2504: 'IKeyEvent': base class undefined在第3行無法修復的循環依賴

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; 
}; 

你不能從一個類繼承,直到它被定義,可以理解。但是我不能定義IKeyEvent直到之後EventDispatcher被定義。

我知道我可以將enum移出Event Dispatcher定義以使其成爲全局的,但這需要重構大部分程序。有沒有辦法讓EventDispatcher繼承於依賴於EventDispatcher的類?

+2

'Unfixable'是正確的。 – SLaks 2009-10-25 21:02:07

+0

需要在派生類中聲明的類型的基類?這個面向對象設計基本上出了什麼問題? – 2009-10-25 21:19:27

+1

@Murali:顯然,這只是一個重構問題。現在正在添加IKeyEvent,而EventDispatcher已經出現了。我認爲在你添加接口時根本不會有錯誤。 – 2009-10-25 21:24:12

回答

5

我的建議:移動EEActions到基類 - 它是接口的一部分,畢竟:

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); 
}; 

如果你那麼也會使從IKeyEvent公共繼承,你可以繼續參考枚舉爲EventDispatcher::EEActions(儘管enum是在基類型中定義的)。