在向量中的指针上使用 delete
Using delete on pointers in a a vector
我是一名爱好编码器,正在通过尝试在控制台上制作文本 RPG 游戏来学习。我现在只是想考虑如何设计我的代码,而且我一直在思考物品和库存 classes 将如何协同工作。我的库存 class 定义如下:
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 的方式可以还是完全愚蠢?或者我应该以不同的方式考虑这个代码结构吗?谢谢你的回答,如果你这样做!非常感谢。
正确的方法是使用迭代器。不要在
中传递'Item'的指针
void AddItem(Item* item) method.
您应该创建 'Item' class 的迭代器并将此迭代器传递给 "AddItem" 方法。类似地创建另一个方法 "RemoveItem",returns 一个 'Item' 的迭代器,可以发送到 Player 的 "CollectMoney" 方法。
如果你不想使用迭代器,你也可以使用 "Item * item" 但你必须调用一个方法 "RemoveItem" 来获取 "Item" 的引用,所以你可以将它传递给 Player。由于项目不是在 class 中创建的,因此不应在 class 中删除它们,因此删除析构函数。
PS use this constructor -> Inventory() {items.resize(10,nullptr);}
我是一名爱好编码器,正在通过尝试在控制台上制作文本 RPG 游戏来学习。我现在只是想考虑如何设计我的代码,而且我一直在思考物品和库存 classes 将如何协同工作。我的库存 class 定义如下:
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 的方式可以还是完全愚蠢?或者我应该以不同的方式考虑这个代码结构吗?谢谢你的回答,如果你这样做!非常感谢。
正确的方法是使用迭代器。不要在
中传递'Item'的指针void AddItem(Item* item) method.
您应该创建 'Item' class 的迭代器并将此迭代器传递给 "AddItem" 方法。类似地创建另一个方法 "RemoveItem",returns 一个 'Item' 的迭代器,可以发送到 Player 的 "CollectMoney" 方法。
如果你不想使用迭代器,你也可以使用 "Item * item" 但你必须调用一个方法 "RemoveItem" 来获取 "Item" 的引用,所以你可以将它传递给 Player。由于项目不是在 class 中创建的,因此不应在 class 中删除它们,因此删除析构函数。
PS use this constructor -> Inventory() {items.resize(10,nullptr);}