【问题标题】:Create a map of objects without destroingthe objects [duplicate]创建对象地图而不破坏对象[重复]
【发布时间】:2016-03-01 23:41:32
【问题描述】:

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

但是我发现插入pair后,对象会被销毁。

如果我尝试使用这个对象中的函数。例如:

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

它将显示: [错误] 调用 'Class::Class()' 没有匹配的函数

[Note] 候选人期望 1 个参数,提供 0 个参数

我该怎么做?

【问题讨论】:

  • 在您的情况下,您似乎可以使用map::at(如果找不到则抛出)而不是map::operator[](尝试插入默认对象,并返回插入/找到的对象)。

标签: c++ class object dictionary


【解决方案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);

【讨论】:

  • 请注意,emplace() 仅适用于 C++11 及更高版本。
  • 非常感谢,非常详细的解释。顺便说一句,你更喜欢哪一个?语法 [ ] 或 .find
  • 是的,在 C++03 中除了复制对象别无选择
  • @CHOCOLEO 我个人更喜欢[],但正如我在回答中解释的那样,对于某些Classes,这是不可能的
  • @M.M 你想举个例子吗?因为我虽然向类添加默认构造函数没有害处。谢谢
【解决方案2】:

通过map.operator[]requires your mapped type to be default constructible访问项目。

如果不是默认可构造的,使用map.find,没有这个要求。

【讨论】:

    猜你喜欢
    • 2020-10-06
    • 1970-01-01
    • 2020-03-05
    • 2014-11-13
    • 2022-01-02
    • 1970-01-01
    • 2017-02-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多