我有class Item
,本身没有兴趣。但是,我需要一些Item
像衣服或武器这样的装备,它们需要额外存储一个enum class Limb
代表身体部位的物体,可以装备它们。此外,普通Item
的 s 必须与 "gear" 一起放置Item
在单个 STL 容器中,并且可能稍后取出,可能作为 "gear" Item
。我在这里看到两个选项:继承
class Item { /* ... */ };
class Gear : public Item {
Limb limb;
// ...
};
std::vector<std::unique_ptr<Item>> items;
std::unique_ptr<Gear> gear = // dynamic cast items[...] and check for success
或者std::optional
class Item {
std::optional<Limb> limb; // if equippable, limb.has_value() == true
// ...
};
std::vector<Item> items;
Item gear = // get items[...] and check limb.has_value()
我喜欢第一个用于可扩展性和编译时类型检查的函数,当一个函数需要Gear
(不仅仅是一个Item
)而不是assert(item.is_gear())
它内部的运行时。
第二个在速度方面似乎更好(即使没有预期的性能问题,我也喜欢关心它)和设计自然性:我不需要了解任何其他class
es 和工程时的特殊用例Item
(例如,像在第一个变体中那样制作它的析构函数virtual
会破坏它)这看起来像是干净和无辜的设计。
哪个决定会更好,为什么?还是有更好的解决方案?