2009-10-25 5 views
0

이 코드 라인 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; 
}; 

가 이해할 정의 될 때까지이 클래스에서 상속 할 수 없습니다에 error C2504: 'IKeyEvent': base class undefined을 제공합니다. 그러나 을 까지 정의 할 수 없습니다.EventDispatcher이 정의 된 후에는 정의 할 수 없습니다.

나는 Event Dispatcher 정의에서 그 enum 정의를 전역으로 만들 수 있지만 프로그램의 많은 부분을 리팩토링해야한다는 것을 알고 있습니다. EventDispatcherEventDispatcher에 종속 된 클래스에서 상속받을 수있는 방법이 있습니까?

+2

'수정할 수 없음'이 맞습니다. – SLaks

+0

파생 클래스에서 선언 된 형식을 필요로하는 기본 클래스? 근본적으로이 OO 디자인에서 잘못된 점이 있습니까? –

+1

@Murali : 분명히 이것은 리팩토링 문제입니다. IKeyEvent가 추가되고 EventDispatcher가 사용되었습니다. 인터페이스를 추가하는 것이 근본적으로 잘못되었다고 생각하지 않습니다. –

답변

5

나의 추천 : 기본 클래스에 EEActions 이동 - 후 모든 인터페이스의 부분입니다 : 당신이 다음도 IKeyEvent 공개에서 상속을하면

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

것은, 당신이 계속 참조 할 수 있습니다 열거 형은 EventDispatcher::EEActions (열거 형이 기본 유형으로 정의되어 있음에도 불구하고)입니다.

관련 문제