C++循环依赖和继承

C++ circular dependency and inheritance

本文关键字:继承 依赖 循环 C++      更新时间:2023-10-16

(我阅读了其他依赖/循环继承问题,但找不到此特定情况的答案(

我有一个父类 InputDevice,它将生成两个子类中的一个。InputDevice1是我们希望连接到每台计算机的东西,而InputDevice2是可能连接到计算机的东西,我们必须检查它是否是。InputDevice1 和 InputDevice2 将具有相同的访问器,但内部逻辑非常不同。

我似乎无法解决依赖问题 - 解决方案可能是我还没有弄清楚的解决方案,或者我的设计可能很糟糕。

My 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 还是相反?我也尝试过前向声明类,但这似乎也不起作用。

我认为最简单的答案是将抽象类(InputDevice及其所有访问器和函数(与您显示的工厂功能分开,即在另一个名为 InputDeviceFactory 的文件中创建另一个类,并将GetDevice放入其中。

然后,两个特定实例将包含 InputDevice.h,工厂将包含 InputDevice1.h 和 InputDevice2.h,并且只需向前声明 InputDevice 类,InputDevice.h 将包含 InputDeviceFactory.h。

实际上,InputDevice.h 不应该包含 InputDeviceFactory。 要求工厂的实现应该在.cpp中,而不是 .h。 这也允许您在工厂中包含 InputDevice.h,而无需进行前向声明。 这让我想到了一些不请自来的一般建议:尽量避免将实现(如GetDevice(放在 .h 文件中。 如果只将声明放在 .h 文件中,则可以在任何地方包含 .h 文件,除非存在真正的循环依赖关系,否则不必担心前向引用。

这不是一个循环依赖问题。您只需要在 InputDevice.hInputDevice1.h 中引用父类。

#include "InputDevice.h"放在两个子类中。父类不需要了解其子类。

您无法在

InputDevice定义InputDevice::GetDevice,因为尚未看到Device2(对于Device2::IsConnected(的定义。因此,删除InputDevice::GetDevice的实现 并在#include所有三个标头后将其放入源文件中。