【问题标题】:Object has members variables values changed after push operation to vector在将操作推送到向量后,对象的成员变量值已更改
【发布时间】:2018-05-04 11:50:15
【问题描述】:

我有一个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;
}

声明后,我正在运行我的 Player 的策略,即:

    player1->executeStrategy(&itemList);

现在在我的玩家的 doOperation(遵循策略模式)中声明如下:

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

我正在运行函数attackerVictory,它带有指向main 中声明的itemList 的指针,以及指向不同Player 拥有的各种Item 的所有指针(为了修改这些)。

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

这是我的攻击者胜利函数:

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。我在这里错过了什么?

【问题讨论】:

  • 了解迭代器失效
  • 不要存储指向内部向量项的指针。如果调整该向量的大小,您存储的那些指针可能会变得无效。示例:vector&lt;int&gt; x; x.push_back(10); int *ptr = &amp;x[0]; x.push_back(20); 如果向量 x 改变大小,ptr 可能不会指向有效内存。
  • 你将指针推送到堆栈变量...繁荣

标签: c++ c++11 pointers vector strategy-pattern


【解决方案1】:

您正在添加对临时对象的引用,该对象在执行攻击者Victory 方法后被销毁。应该是

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

    listOfItems->push_back(tempptr);
}

【讨论】:

  • 一个问题,但不是唯一的问题。有一个非常讨厌的架构缺陷需要解决。除此之外,你可以用一块石头杀死两只鸟。利用复制构造函数 (Item * tempptr = new Item(*x);) 而不是先构造然后赋值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多