2016-03-01 83 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中,除了复制 –