C++循环依赖和继承
C++ circular dependency and inheritance
(我阅读了其他依赖/循环继承问题,但找不到此特定情况的答案(
我有一个父类 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.h
和 InputDevice1.h
中引用父类。
将#include "InputDevice.h"
放在两个子类中。父类不需要了解其子类。
InputDevice
中定义InputDevice::GetDevice
,因为尚未看到Device2
(对于Device2::IsConnected
(的定义。因此,删除InputDevice::GetDevice
的实现 并在#include
所有三个标头后将其放入源文件中。
- 初始化依赖于子类的继承类的常量类成员
- 循环依赖,在继承类的情况下使用覆盖方法
- 当依赖关系和依赖关系都是多态时,在哪个继承级别存储依赖关系指针?
- 正在从继承中解析循环依赖项
- 继承依赖类型定义而不使用结构
- 相互依赖的类和继承
- C++ 上的循环依赖和继承编译错误
- 模板类型依赖和继承
- 依赖注入/继承设计模式的构造函数参数太多
- 如何在Visual Studio中将项目依赖项/引用从一个项目继承到依赖项目
- C++中对继承的循环依赖
- 依赖类的C++继承和实例化
- 在多继承编译器的情况下访问成员变量是否依赖?如何正确地做
- 如何在C++中管理并行的依赖继承
- C++相互依赖的类的继承
- C++循环依赖和继承
- 处理对继承的循环依赖
- 模板继承:没有依赖模板形参的实参
- 具有继承模板类的循环依赖关系
- 如何使继承依赖