2013-09-27 120 views
0

(我讀其他的依賴性/循環繼承問題,但無法找到這種特殊情況下的答案)C++循環依賴和繼承

我有一個父類,的InputDevice,這將產生兩個子類中的一個。 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是:

class InputDevice1 : public InputDevice{ 
public: 
    ...declarations of any functions InputDevice1 will overload... 
} 

雖然InputDevice2.h是:

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

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

我不知道其中文件放入#include語句... InputDevice.h引用InputDevice2.h或其他方式嗎?我也嘗試了前向聲明類,但是這似乎也不起作用。

+0

你在混合概念。 InputDevice定義了一個接口,它不應該知道可能從中繼承哪些類型。不同的類可以處理可用/使用的輸入設備的實際實例。你可以通過仔細地使用前向聲明和分離類型和實現的定義來進行編譯,但是你可能想要考慮重新設計 –

回答

1

我認爲最簡單的答案是你的抽象類分開 - InputDevice其所有的存取和功能 - 從你顯示工廠的功能,即使稱爲InputDeviceFactory另一個文件的另一個類,並在放GetDevice

然後這兩個特定的實例將包含InputDevice.h,工廠將包含InputDevice1.h和InputDevice2.h,並且只是前向聲明InputDevice類,而InputDevice.h將包含InputDeviceFactory.h。

實際上,InputDevice.h不應該包含InputDeviceFactory。需要工廠的實現應該在.cpp中,而不是.h。這也可以讓你在Factory中包含InputDevice.h,而不用做前向聲明。這給我帶來了一些未經請求的一般建議: 儘量避免將實現(例如GetDevice)放入.h文件中。如果只將聲明放在.h文件中,則可以在任何位置包含.h文件,而不必擔心前向引用,除非存在真正的循環依賴關係。

+1

這是我的解決方案。我沒有創建另一個'InputDeviceFactory'類,我只有一個函數'GetInputDevice()',可以從任何地方調用。 – escapecharacter

1

這不是一個循環依賴問題。您只需參考InputDevice.hInputDevice1.h中的父類。

#include "InputDevice.h"放在兩個子類中。家長不需要知道孩子的情況。

1

因爲Device2(用於Device2::IsConnected)的定義還沒有見過你不能定義InputDevice::GetDeviceInputDevice。因此,刪除InputDevice::GetDevice 的實現,並將其放在源文件中,之後是#include所有三個標頭。