C++ C++;循环依赖和继承
(我阅读了其他依赖项/循环继承问题,但找不到此特定案例的答案) 我有一个父类InputDevice,它将生成两个子类中的一个。InputDevice1是我们希望连接到每台计算机的东西,InputDevice2是可能连接到计算机的东西,我们必须检查它是否连接到计算机。InputDevice1和InputDevice2将具有相同的访问器,但内部逻辑非常不同 我似乎无法解决依赖性问题-解决方案可能是我还没有找到的,或者我的设计可能不好 我的输入设备.h看起来像C++ C++;循环依赖和继承,c++,inheritance,circular-dependency,C++,Inheritance,Circular Dependency,(我阅读了其他依赖项/循环继承问题,但找不到此特定案例的答案) 我有一个父类InputDevice,它将生成两个子类中的一个。InputDevice1是我们希望连接到每台计算机的东西,InputDevice2是可能连接到计算机的东西,我们必须检查它是否连接到计算机。InputDevice1和InputDevice2将具有相同的访问器,但内部逻辑非常不同 我似乎无法解决依赖性问题-解决方案可能是我还没有找到的,或者我的设计可能不好 我的输入设备.h看起来像 class InputDevice{ p
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.h
和InputDevice1.h
中引用父类
在两个子类中放置
#包括“InputDevice.h”
。父类不需要知道它的子类。这不是循环依赖性问题。您只需要在InputDevice.h
和InputDevice1.h
中引用父类
在两个子类中放置
#包括“InputDevice.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
及其所有访问器和函数与正在显示的工厂功能分开,也就是说,在另一个名为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::GetDevice
内部定义InputDevice
,因为Device2
(对于Device2::IsConnected
)未被看到。因此,请删除InputDevice::GetDevice
并将其放入源文件中,在
之后包含所有三个头。您不能在输入设备中定义
,因为设备2
的定义(对于设备2::已连接
)尚未看到。因此请删除InputDevice::GetDevice
在#包含
所有三个标题后,将其放入源文件。您在混合概念。InputDevice
定义了一个接口,它不应该知道可能从中继承哪些类型。另一个类可以处理可用/使用的输入设备的实际实例。您可以按原样进行编译只需仔细使用前向声明并拆分类型和实现的定义,但您可能需要考虑重新设计混合概念。<代码>输入设备< /代码>定义了一个接口,它不应该知道可能从中继承什么类型。可以通过使用前向声明和拆分类型和实现的定义来进行编译,但您可能需要考虑重新设计,这是我使用的解决方案。我没有做另一个<代码> InputDeviceFactory <代码>类,我只有一个函数<代码>InputDevice()
可以从任何地方调用。这是我使用的解决方案。我没有创建另一个InputDeviceFactory
类,我只有一个可以从任何地方调用的函数GetInputDevice()
。