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);
}
はそう空itemName
とownerAmount
値でlistOfItems
なら、私は最後にItem
ています提供します。私はここで何が欠けていますか?
イテレータの無効化について読む –
内部ベクトルのアイテムへのポインタを保存しない**そのベクトルのサイズを変更すると、保存したポインタが無効になる可能性があります。例: 'ベクトル x; x.push_back(10); int * ptr = &x[0]; x.push_back(20); 'ベクトル' x'がサイズを変更した場合、 'ptr'は有効なメモリを指していない可能性があります。 –
PaulMcKenzie
[可能な重複](https://stackoverflow.com/questions/6438086/iterator-invalidation-rules) – PaulMcKenzie