C ++如何在不调用构造函数的情况下分配对象

时间:2016-06-10 08:43:18

标签: c++ constructor unordered-map

我有一个班级:

class C {
public:
    C(): _a(a++){}
private:
    static int a;
    int _a;
};

int C::a = 0;
C c = C(); // c._a is 0
C d = C(); // d._a is 1
C e = C(); // e._a is 2

这正如我所期望的那样:a和obj._a递增1.但是如果我将c,d和e分配给unordered_map,它们会递增2:

unordered_map<int, C> map;
C c = C(); // c._a is 0
map[0] = c;
C d = C(); // d._a is 2
map[1] = d;
C e = C(); // e._a is 4
map[2] = e;

如何指定c,d和e进行映射并仍使静态int增加1?

2 个答案:

答案 0 :(得分:5)

问题来自你的地图。当您访问map [0]时,映射将查找条目0,如果它不存在,将实例化它并返回对新实例的引用。 请尝试使用map.emplace(0, c)来添加地图中的项目。

答案 1 :(得分:2)

您的问题是表达式map[0]正在创建默认构造的“C”(并递增计数器),然后将该对象分配给。

解决方案是直接在地图中插入对象:

    map.insert({0,c});