【发布时间】:2017-09-01 22:48:58
【问题描述】:
我是一名业余程序员,正在通过尝试在控制台上制作文本角色扮演游戏来学习。我现在只是想考虑如何设计我的代码,而我却被困在物品和库存类如何协同工作上。我有这样定义的库存类:
class Inventory {
private:
vector<Item*> items;
public:
Inventory() {
items.resize(10);
for (int i = 0; i < 10; ++i) {
items[i] = nullptr;//so I can still display an empty inventory
}
};
~Inventory() {
for (int i = 0; i < 10; ++i) {
delete items[i];
}
}
void AddItem(Item* item) {
for (int i = 0; i < items.size(); ++i) {
if (items[i] == nullptr) {//if the slot is empty
items[i] = item;
break;
}
}
}
void Show() const {
for (int i = 0; i < items.size(); ++i) {
cout << "Slot " << i + 1 << ": ";
if (items[i] == nullptr) {
cout << "<Empty Slot>" << endl;
} else {
cout << "<" << items[i]->GetName() << ">" << endl;
}
}
}
};
最终我打算让敌人在死后掉落战利品,所以我需要使用new 创建物品,然后将它们转移到玩家的库存中。我的问题是,我应该只了解智能指针并使用它们,还是我在这里调用 delete 的方式可以还是完全愚蠢?还是我应该以不同的方式考虑这个代码结构?谢谢你的回答,如果你这样做了!我真的很感激。
【问题讨论】:
-
首选方式是
std::vector<Item>,而不是null条目。如果你真的需要指针,那么std::vector<std::unique_ptr<Item>> -
@ZekeWillams 虚拟派生确实是使用指针的原因,但即便如此,也不是原始指针。使用智能指针和proper RAII concepts.
-
如果库存永远不会改变大小,请查看
std::array。这是一个更智能的固定大小数组。 -
如果库存大小可能是动态的,那么像
std::vector这样的动态容器就可以了。关于std::optional是/做什么,你可以read aboutstd::optionalhere。它是 C++17 的一部分,因此您的工具链可能不符合使其成为...的选项(可怜的双关语无意)。
标签: c++ oop vector game-engine inventory