将操作推送到向量后,对象的成员变量值发生了变化

Object has members variables values changed after push operation to vector

我有一个 std::vector<Item*> listOfItems,其中包含指向 Item 个对象的指针。

我有两个参数用于 Item 的构造函数,

Item::Item(std::string name, int amount)
{
    itemName = name;
    ownerAmount = amount;       
}

我还有Player个对象,它有一个成员变量std::vector<Item> ownedItems

我在主文件中创建了一个向量,其中包含指向各种 Player 所拥有的所有 Item 对象的指针,声明如下:

std::vector<Item*> itemList = listOfItems(players);

哪里

std::vector<Item*> listOfItems(std::vector<Player*> players) {
    std::vector<Item*> listOfItems itemList;
    for (int i = 0; i < players.size(); i++) {
        for (int j = 0; j < players.at(i)->getAllCountries()->size(); j++) {
            itemList.push_back(&players.at(i)->getAllCountries()->at(j));
        }
    }
    return itemList;
}

声明后,我运行我的玩家的策略是:

    player1->executeStrategy(&itemList);

现在在我的播放器的 doOperation(遵循策略模式)中声明如下:

    void HumanPlayerStrategy::doOperation(Item* x, std::vector<Item*> *itemList){
                    attackerVictory(x, itemList);   
}

我是 运行 函数 attackerVictory,它有一个指向在 main 中声明的 itemList 的指针,所有指针都指向不同 Item 拥有的 Player(为了修改这些)。

唯一的问题是,在我完成 attackerVictory 中的操作后,添加到 itemList 的任何 Item 都具有空白成员变量值。 我似乎不明白为什么这行不通?

这是我的 attackerVictory 函数:

void Strategy::attackerVictory(Item* x, std::vector<Item*> *listOfItems) {
    Item temp = *x;
    /* set different member variable values for the Item temp */
    listOfItems->push_back(&temp);
}

如果 listOfItems 具有空的 itemNameownerAmount 值,那么这样做最后会给我 Item。我在这里错过了什么?

您正在添加对一个临时对象的引用,该对象在执行 attackerVictory 方法后被销毁。应该是

void Strategy::attackerVictory(Item* x, std::vector<Item*> *listOfItems){
    Item * tempptr = new Item();
    *tempptr = *x;

    listOfItems->push_back(tempptr);
}