2016-03-01 126 views
0

我想創建一個包含具有不同參數的對象的地圖。創建一個對象的地圖而不破壞對象

但是我發現插入這對後,對象將被銷燬。

如果我嘗試使用該功能在此object.For例如:

#include <map> 
#include <iostream> 

class Test{ 
    public: 
     Test(double value) : value_(value){} 
     ~Test(){std::cout<< "destroyed";} 
     void plusone() {value_ += 1;} 
    private: 
     double value_; 
}; 

int main(){ 
    std::map<long, Test> map; 

    map.insert(std::make_pair(1, Test(1.2))); 
    map[1].plusone(); 
    return 0; 
} 

它會顯示: [錯誤]對於呼叫沒有匹配功能 '類::類()'

[備註]候選人期望1參數,0提供

我該怎麼做?

+0

在你的情況,似乎你可以使用'map :: at'(throw if not found)而不是'map :: operator []'(嘗試插入默認對象,並返回插入/找到的對象)。 – Jarod42

回答

1

語法map[1]只能在映射類型具有默認構造函數時使用。這是因爲如果找不到鍵,則會插入一個默認構造的對象,但編譯器必須在編譯時爲此生成代碼。

如果你不想添加默認的構造函數,那麼你必須使用不同的查找代碼,例如:

auto it = map.find(1); 
if (it != map.end()) 
    it->second.memberfuncion(); 

而且,你的錯誤信息無關,與破壞對象,您的標題中提到。


在代碼map.insert(std::make_pair(1, Class(argument)));,您可以創建一個臨時對象Class(argument),並複製到地圖。然後,臨時對象被銷燬。

如果您想避免這種情況並直接在地圖上構建,請使用map.emplace(1, argument);

+0

請注意,'emplace()'僅在C++ 11及更高版本中可用。 –

+0

非常感謝你,非常詳細的解釋。 btw你更喜歡哪一個? 語法[]或.find – CHOCOLEO

+0

是的,在C++ 03中,除了複製 –