2016-06-10 104 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}); 
相關問題