C++ - 有一个类型能够容纳它 children
C++ - Have a type be able to hold it's children
我有一个设备类型的链表:
Node<Device> list = new Node<device>(device);
并且 Device 派生了 classes:
而且我需要我的列表能够容纳每个派生的 class 设备。
我该怎么做?
注意:如果我向列表发送 Aerobic_Device,它只是动态转换为设备,这会丢失数据。
编辑:
我更改了我的程序的所有逻辑以使用指针,现在列表是:Node<Device*>
- 它仍然将所有内容转换为设备类型。
现在,正如许多人建议的那样,我将其切换为 Node<std::unique_ptr<Device>>
,但这只会引入很多很多错误。
使列表成为 Device*
类型(注意指针)。
Node<Device*> list;
然后,声明派生类型的对象(PowerDevice
、AerobicDevice
、PowerAerobicDevice
)并将它们放入列表中。
这样您就可以利用运行时多态性的强大功能。
或者,您可以(并且应该)使用智能指针而不是原始指针来自动处理内存:
std::unique_ptr<Device> pDevice= std::make_unique<PowerDevice>(...);
// put into list
std::unique_ptr<Device> aDevice= std::make_unique<AerobicDevice>(...);
// put into list
std::unique_ptr<Device> paDevice= std::make_unique<PowerAerobicDevice>(...);
// put into list
您不能按值存储对象并同时具有多态行为。您可以通过(最好是智能)指针存储您的对象:
Node<std::unique_ptr<Device>> list;
我有一个设备类型的链表:
Node<Device> list = new Node<device>(device);
并且 Device 派生了 classes:
而且我需要我的列表能够容纳每个派生的 class 设备。
我该怎么做?
注意:如果我向列表发送 Aerobic_Device,它只是动态转换为设备,这会丢失数据。
编辑:
我更改了我的程序的所有逻辑以使用指针,现在列表是:Node<Device*>
- 它仍然将所有内容转换为设备类型。
现在,正如许多人建议的那样,我将其切换为 Node<std::unique_ptr<Device>>
,但这只会引入很多很多错误。
使列表成为 Device*
类型(注意指针)。
Node<Device*> list;
然后,声明派生类型的对象(PowerDevice
、AerobicDevice
、PowerAerobicDevice
)并将它们放入列表中。
这样您就可以利用运行时多态性的强大功能。
或者,您可以(并且应该)使用智能指针而不是原始指针来自动处理内存:
std::unique_ptr<Device> pDevice= std::make_unique<PowerDevice>(...);
// put into list
std::unique_ptr<Device> aDevice= std::make_unique<AerobicDevice>(...);
// put into list
std::unique_ptr<Device> paDevice= std::make_unique<PowerAerobicDevice>(...);
// put into list
您不能按值存储对象并同时具有多态行为。您可以通过(最好是智能)指针存储您的对象:
Node<std::unique_ptr<Device>> list;