c++ - 在不破坏对象的情况下创建对象映射

标签 c++ class object dictionary

<分区>

我正在尝试创建一个 map ,其中包含具有不同参数的对象。

但是我发现插入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()”的匹配函数

[注意] candidate expects 1 argument, 0 provided

我该怎么做?

最佳答案

map[1] 语法只能在映射类型具有默认构造函数时使用。这是因为如果找不到 key ,则会插入默认构造的对象,但编译器必须在编译时为此生成代码。

如果您不想添加默认构造函数,那么您必须使用不同的查找代码,例如:

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

此外,正如您的标题所述,您的错误消息与销毁对象无关。


在代码 map.insert(std::make_pair(1, Class(argument))); 中,您创建了一个临时对象 Class(argument),并且将其复制到 map 中。然后临时对象被销毁。

如果您想避免这种情况并直接在 map 中构建,请使用 map.emplace(1, argument);

关于c++ - 在不破坏对象的情况下创建对象映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35735829/

相关文章:

c++ - 如何为链表编写_find 方法?

c++ - 能够将子类实例分配给堆栈框架中的基类变量的动机是什么?

php - 范围解析运算符和类方法

python - 从 Python 列表中存储和检索对象

c++ - C++ 中的 vector 指针和通过引用传递对象

c++ - 可变参数模板。一些问题

c++ - Visual Studio 调试 - 局部变量的顺序?

c# - 使用反射将 JSON 字符串反序列化为类

php - 在php中创建匿名对象

C++ Vector 迭代器不兼容,但迭代器似乎对我有效