2017-11-21 12 views
0

Itemオブジェクトへのポインタを保持するstd::vector<Item*> listOfItemsがあります。オブジェクトには、ベクトルへのプッシュ操作後に変更された変数値があります

私はまた、メンバー変数std::vector<Item> ownedItemsを有するPlayerオブジェクトを有するItemのコンストラクタのための2つのパラメータ、

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

を有します。この後

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が所有するすべてのItemオブジェクトへのポインタを持つベクトルが私のメインのファイルで作成されました私は私のプレーヤーの戦略を実行しています:

player1->executeStrategy(&itemList); 

は、今私のプレーヤーの(Strategyパターン以下)doOperationに次のように宣言:

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

私は、様々なItem所有する全てのポインタとメインで宣言さitemListへのポインタで機能attackerVictoryを実行していますよ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); 
} 

はそう空itemNameownerAmount値でlistOfItemsなら、私は最後にItemています提供します。私はここで何が欠けていますか?

+0

イテレータの無効化について読む –

+1

内部ベクトルのアイテムへのポインタを保存しない**そのベクトルのサイズを変更すると、保存したポインタが無効になる可能性があります。例: 'ベクトル x; x.push_back(10); int * ptr = &x[0]; x.push_back(20); 'ベクトル' x'がサイズを変更した場合、 'ptr'は有効なメモリを指していない可能性があります。 – PaulMcKenzie

+0

[可能な重複](https://stackoverflow.com/questions/6438086/iterator-invalidation-rules) – PaulMcKenzie

答えて

0

attackerVictoryメソッドの実行後に破棄される一時オブジェクトへの参照を追加しています。

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

    listOfItems->push_back(tempptr); 
} 
+0

問題ですが、唯一の問題ではありません。解決しなければならないかなり厄介な建築上の欠陥があります。それ以外に、あなたは一つの石で2羽の鳥を殺すことができます。コピーコンストラクタ( 'Item * tempptr = new Item(* x);')を利用し、それを構成してから割り当てます。 – user4581301

関連する問題