2013-05-10 33 views
0

我有一個類:C++ STL - 插入的自定義類作爲映射值

class Monster : public Player 
{ 
public: 
    // Copy constructor - used for populating monster list in Game class 
    Monster(int newType) 
    { 
     type = newType; 
     canmove = true; 
     notforward = false; 
    } 

    int type; 

    bool operator==(const Monster& m) const {return type == m.type;} 
    bool operator!=(const Monster& m) const {return type != m.type;} 
    bool operator< (const Monster& m) const {return type < m.type;} 
    bool operator<=(const Monster& m) const {return type <= m.type;} 
    bool operator> (const Monster& m) const {return type > m.type;} 
    bool operator>=(const Monster& m) const {return type >= m.type;} 
}; 

某些變量(如canmove和notforward)繼承。接着,在不同的類中創建地圖的怪物:

map<pair<int, int>, Monster> monsters; // Pair used for x and y coordinate 

monsters.insert(make_pair(10, 10), Monster(10)); 
// Error - No instance of overloaded function 

如何,我可以得到怪物實例到怪物的地圖?我添加了所有的運算符重載,以便能夠插入,但它不起作用!

+0

這是爲什麼說「win32」?它與此無關。 – asveikau 2013-05-10 05:11:24

+0

好點。編輯。 – 2013-05-10 05:26:50

回答

0

簡單的方法是

monsters[make_pair(10, 10)] = Monster(10); 

另一種方式是

monsters.insert(make_pair(make_pair(10, 10), Monster(10))); 

又是

monsters.insert(map<pair<int, int>, Monster>::value_type(make_pair(10, 10), Monster(10))); 

的操作符重載是不必要的,你確實需要重載operator <爲關鍵的地圖,但不是v ALUE。我想你可能會感到困惑,因爲在第二種情況下需要兩個make_pair調用。

+0

啊!當然!這總是很簡單的事情。謝謝! – 2013-05-10 04:26:09

+0

@BrianGradin我應該補充說,第一個例子確實需要Monster有一個默認的構造函數,這在發佈的代碼中並非如此。 – john 2013-05-10 04:35:08