在向量中的指针上使用 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);}