在不破坏对象的情况下创建对象地图

时间:2016-03-01 23:41:32

标签: c++ class object dictionary

我正在尝试创建一个包含具有不同参数的对象的地图。

但是我发现在插入对之后,对象将被破坏。

如果我尝试在此对象中使用该函数。例如:

#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;
}

它将显示: [错误]没有匹配函数来调用&#39; Class :: Class()&#39;

[注意]候选人需要1个参数,0提供

我该怎么做?

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分:0)

通过map.operator[] requires your mapped type to be default constructible进行商品访问。

如果它不是默认可构造的,请使用没有此类要求的map.find