2013-09-27 2 views
0

(나는 다른 종속/원형 상속 질문을 읽을 수 있지만이 특정 사건에 대한 대답을 찾을 수 없습니다) 나는 부모 클래스는,의 InputDevice, 즉 두 개의 하위 클래스 중 하나 스폰이는 C++ 순환 종속성 및 상속

을 . InputDevice1은 모든 컴퓨터에 연결될 것으로 예상되며, InputDevice2는 컴퓨터에 연결될 수있는 것이므로 확인해야합니다. InputDevice1과 InputDevice2는 동일한 접근 자이지만 매우 다른 내부 논리를 갖습니다.

내가 의존성 문제를 해결할 수없는 것 같습니다. 솔루션을 아직 찾지 못했거나 디자인이 좋지 않을 수 있습니다.

내 InputDevice.h는

class InputDevice{ 
private: 
    InputDevice* inputDevice; 

public: 
    static InputDevice* GetDevice() { 
     //we expect only one type of device to be 
     //connected to the computer at a time. 

     if (inputDevice == nullptr) { 
      if (InputDevice2::IsConnected) 
       inputDevice = new InputDevice2(); 
      else 
       inputDevice = new InputDevice1();  
     } 

     return inputDevice; 
    } 

    ...standard accessors and functions... 
}; 

처럼 보인다 그리고 InputDevice1.h은 다음과 같습니다

는 InputDevice2.h이다
class InputDevice1 : public InputDevice{ 
public: 
    ...declarations of any functions InputDevice1 will overload... 
} 

동안 :

class InputDevice2 : public InputDevice{ 
public: 
    static bool IsConnected(); 

    ...declarations of any functions InputDevice2 will overload... 
} 

내가하는 확실하지 않다 #include 문을 넣을 파일 ... InputDevice.h는 InputDevice2.h를 참조하거나 그 반대의 방법을 사용합니까? 나는 또한 forward-declaring 클래스를 시도했지만, 이것 역시 작동하지 않는다.

+0

개념을 혼합하고 있습니다. 'InputDevice'는 인터페이스를 정의합니다. 어떤 타입이 그것으로부터 상속받을 수 있는지를 알아서는 안됩니다. 다른 클래스가 사용 가능/사용되는 입력 장치의 실제 인스턴스를 처리 할 수 ​​있습니다.이 선언은 정방향 선언을 신중히 사용하고 유형 및 구현의 정의를 분할하는 방식으로 컴파일 할 수 있지만 재 설계를 고려할 수도 있습니다. –

답변

1

내가 가장 쉬운 대답은 당신의 추상 클래스를 분리하는 것입니다 생각 당신이 표시하고있는 공장 기능에서, 즉 InputDeviceFactory라는 다른 파일에 다른 클래스를 만들고, 그에 GetDevice를 넣어 .

두 개의 특정 인스턴스에는 InputDevice.h가 포함되고 공장에는 InputDevice1.h 및 InputDevice2.h가 포함되며 InputDevice 클래스를 선언하면 InputDevice.h에는 InputDeviceFactory.h가 포함됩니다.

실제로 InputDevice.h에는 InputDeviceFactory가 포함되어서는 안됩니다. 팩토리를 필요로하는 구현은 .hpp가 아닌 .cpp에 있어야합니다. 이렇게하면 앞으로 선언을하지 않고도 InputDevice.h를 팩토리에 포함시킬 수 있습니다. 이것은 일반적인 자발적인 조언을 제공합니다 : .h 파일에 구현 (예 : GetDevice)을 넣지 않도록하십시오. .h 파일에 선언을 넣는 경우에만 .h 파일을 아무 곳에 나 포함 할 수 있으며 진정한 순환 종속성이 없으면 앞으로 참조를 걱정할 필요가 없습니다. Device2 (Device2::IsConnected 용)의 정의 본되지 않았기 때문에

+1

이것은 제가 사용했던 해결책입니다. 나는 또 다른'InputDeviceFactory' 클래스를 만들지 않았고, 어디서나 호출 될 수있는'GetInputDevice()'함수를 가지고 있습니다. – escapecharacter

1

이것은 순환 종속성 문제가 아닙니다. Parent 클래스를 InputDevice.hInputDevice1.h으로 참조하면됩니다.

두 자식 클래스 모두에 #include "InputDevice.h"을 배치하십시오. 부모 클래스는 자녀에 대해 알 필요가 없습니다. 그 접근과 모든 기능과 InputDevice - -

1

당신은하지 InputDevice 내부InputDevice::GetDevice을 정의 할 수 있습니다. 따라서 InputDevice::GetDevice 의 구현을 제거하고 #include 세 헤더를 모두 입력 한 후 소스 파일에 넣으십시오.