2017-01-02 4 views
1

私はしばらくの間この問題を抱えており、これについての意見があります。あなたがそれをやるより良い方法があれば教えてください。 実行しないエンティティ内のアイテムのベクトルにアクセスしようとする場合を除いて、すべてがうまく動作します。常に空であると言います。構造体内のベクター内で構造体内のベクターに追加しようとすると、失敗するのはなぜですか?

struct sObj{ 
    char itemName[64]; 
    int itemStrenght; 
}; 

struct sEnt{ 
    char entityName[64]; 
    vector<sObj> entityItems; 
}; 

class cTemp{ 
public: 
    void addEntity(sEnt entity){ entityList.push_back(sEnt); } 
    void addItemToEnt(char* entityName, sObj itemDetails); 
    void setAllItemStrenght(char* itemName, int newStr); 
private: 
    vector<sEnt> entityList; 
}; 

void cTemp::addItemToEnt(char* entityName, sObj itemDetails){ 
    for(auto m : entityList){ 
     if(!_stricmp(m.entityName, entityName)){ 
      m.entityItems.push_back(itemDetails); 
      m.entityItems.push_back(itemDetails); // just for testing 
      msgBox("Item count: %i", m.entityItems.size()); // is working 
     } 
    } 
} 

void cTemp::setAllItemStrenght(char* itemName, int newStr){ 
    for(auto m : entityList){ 
     msgBox("Item count: %i", m.entityItems.size()); // returns 0 
     for(auto n : m.entityItems){ 
      // never gets executed 
     } 
    } 
} 
+0

どこで 'addItemToEnt'を呼び出すのですか?ベクトルが空の場合、おそらくそれはあなたがそれを埋めることがないからです。 –

+1

ところで、あなたは 'std :: string'を使うべきです –

+0

私はそれに応じてすべてを呼び出します。上記のコードは私の問題の一例です。実際のコードではありません。ポストのために短くしたいからです。正確な問題はFrankによって答えられました。そしておそらく@GuillaumeRacicot。しかし、私が今までに書いたやり方は、charを使っています。そして今はうまくいく。私はあなたの助言を取り、それを統合します。ありがとうございました。 – GreySkull

答えて

5

問題はここにある:

void cTemp::addItemToEnt(char* entityName, sObj itemDetails){ 
    for(auto m : entityList){ 

あなたのループは、それらへの参照、entryListからコピーされた値にない取り組んでいます。あなたは欲しい:

for(auto& m : entityList){ 
+0

ありがとうございます。私はそれを完全に見落とした。あなたは私に多くの時間を節約しました!できるだけ早くあなたの答えを受け入れます! – GreySkull

関連する問題