gpt4 book ai didi

c++ - 关于继承的项目系统问题

转载 作者:太空狗 更新时间:2023-10-29 21:22:12 25 4
gpt4 key购买 nike

我有一个关于如何在 C++ 中解决以下问题的问题:

所以,假设我有 2 件元素。一把剑,一把刀。

剑的结构如下所示:

baseItem > Equippable (Holds events and boolean checks) > Weapon (Same) > Sword

一把刀的结构如下所示:

baseItem > Equippable > Weapon > Knife

我处理项目的大部分类和函数(库存、容器、创建项目实例的函数)都属于 baseItem 类型。

如何指定函数,例如:

baseItem createItem(int index, type itemType)

以这样一种方式,我可以返回或施放回剑/刀?这对库存尤其重要,因为我需要从 ItemSlot 中提取元素,它也将保存 baseItem 类型的对象,但需要不断检查它们是否是 Sword、Knife 等。

最佳答案

您可以使用模板成员函数来实现,如下所示:

class baseItem {
... // Private members
public:
template <typename T> static T* createItem(int index);
};

然后您将能够在类型参数中使用确切的类型来调用它,如下所示:

Sword *sword = basrItem::createItem<Sword>(123);

Demo on ideone.

一些注意事项:

  • 你需要通过指针返回,常规或“智能”,以避免object slicing .
  • 您可能希望将 createItem 成员移动到单独的“工厂”/“注册表”类
  • 如果您保留注册表,则需要注意对象的所有权(即,避免在对象在注册表中时删除它们,或者在它们在其他地方使用时离开注册表时避免删除它们)。

为了说明最后一点,这里是我所说的注册表类的意思:

class baseItemRegistry {
map<int,unique_ptr<baseItem> > registry;
public:
template <typename T> static T* createItem(int index) {
map<int,baseItem*>::const_iterator iter = registry.find(index);
if (iter != registry.end()) {
return dynamic_cast<T*>(iter->second);
}
T* res = new T(index);
registry[index] = res;
return res;
}
};

这会让你保留一个你可以决定共享的 baseItemRegistry 对象,但你也可以隐藏它,因为你需要一个“私有(private)”注册表。 static 函数没有这种灵 active 。

关于c++ - 关于继承的项目系统问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21096810/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com