2014-07-18 38 views
0

我遇到了將元素插入到地圖時的問題,我假設每次將新對象放入地圖時,前一個都會被覆蓋。每當我打印出地圖的內容時,只會打印最近添加的項目。我有兩個類,一個食譜類和一個成分類。我的食譜有一個map<Ingredient*, int>它持有和對象及其數量。爲什麼在將對象插入地圖時,我的密鑰被覆蓋?

Recipe::Recipe(){ 
    title = ""; 
    ingredients; 
} 

void Recipe::insertIngredient(Ingredient* item, int quantity){ 
    ingredients.insert(make_pair(item, quantity )); 
} 

Ingredient::Ingredient(){ 
    name = ""; 
    unit = ""; 
} 

我對每個我用來初始化變量和內容打印出來類的getter和setter,但每當我打印我的食譜的地圖內容,只有我把它付諸表決的最後一個項目被打印出來。以下是我的主要功能打印出地圖。

map<Ingredient*, int> tempIngredients = tempRecipe->getIngredients(); 

map<Ingredient*, int>::iterator ingredientIt; 

for (ingredientIt = tempIngredients.begin(); ingredientIt!= tempIngredients.end(); ingredientIt++) { 
    Ingredient* tempIngredient = ingredientIt->first; 
    int quantity = ingredientIt->second; 
    cout << "\n" << tempIngredient->getName() << " " << tempIngredient->getUnit() << " " << quantity << flush; 
} 

我的輸出目前是以下:

未漂白小麥混合麪粉C. 1

哪個是igredient的姓名,單位和量的最後一個元素的(從地圖值)I添加。

回答

0

您正在使用地圖鍵的指針而未實施比較運算符。

使用Ingredient對象並執行operator<會更好。

例如,

class Ingredient { 
    public: 
     bool operator<(const Ingredient & b) const { 
      return getName() < b.getName(); 
     } 

    // Rest of class methods data etc... 
}; 

std::map<Ingredient, int> ingredients; 
+0

這樣做我收到錯誤傳遞'const Ingredient'作爲'std :: string Ingredient :: getName()'的'this'參數丟棄限定符 –

+0

您需要添加一個'const'版本的get name。 'const const std :: string&getName()const {return ...}' – GWW

+0

我加了'const string&getName()const { return name;並且給出了同樣的錯誤。我改變了我的成分從指針到物體,是否需要? –

0

你怎麼打電話insertIngredient?由於您的地圖是由Ingredient*鍵入的,因此每個條目必須是唯一的Ingredient對象(通過新建或離開堆疊)或鍵將發生衝突。

真正的問題是你爲什麼鍵入指針? Per @ GWW的答案是,更好的解決方案是存儲Ingredient值併爲它們創建自定義比較器函數。

+0

從我的主我有'tempRecipe-> insertIngredient(tempIngredient-> iterateIngredients(成分),數量);''分析XML文件的成分及其數量。 –

相關問題