2016-06-10 105 views
2

有一个类:C++如何分配对象,而不调用构造函数

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 

这工作了,我会期望:和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映射,仍然由1使静态INT一个增量?

回答

5

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

+0

是的,这是要走的路。即使'insert'也可以工作,因为'C'的复制/移动控制器不会修改'a'。 – Angew

+0

。使用emplace_back而不是push_back,使用emplace而不是copy – Yves

2

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

解决的办法是直接插入对象的地图:

map.insert({0,c}); 
相关问题