2014-02-24 28 views
0

是一個類的移動構造函數,該類包含一個應該刪除它的動態分配數組?比如我有:移動自定義容器的構造函數?

template<typename T> 
class MyVector 
{ 
public: 
MyVector() 
{ 
data = new T[32]; 
capacity = 32; 
size = 0; 
} 

MyVector(const MyVector<T>& o) //The basic copy constructor 
{ 
capacity = o.capacity; 
size = o.size; 
data = new T[capacity]; 

for(int i = 0; i < _size; i++) 
{ 
data[i] = o.data[i]; 
} 
} 

MyVector(const MyVector<T>&& o) //The move constructor 
{ 
//What goes here? 
} 

private: 
T* data; 
unsigned int size; 
unsigned int capacity; 
}; 

我明白,當我做類似的舉動調用構造函數:

MyVector A; A = MyVector(); //右邊的那個得到一個叫做移動構造函數? 所以它應該是相同的複製構造函數?

+0

這可能只是一個拋棄練習,但是你的'Vector'不適用於沒有默認構造函數的類型。真正的矢量不會創建32個新的「T」;它們爲32'T'分配足夠的內存,然後通過placement-new將需要的對象存儲到需要的對象中。 – fredoverflow

回答

2

是一個類的移動構造函數,該類包含一個動態分配的數組,應該刪除它?例如我有:

沒有什麼可刪除的。目標是畢竟構造了。它應該做的就是從RHS上的對象中獲取資源。它應該讓RHS處於合理的狀態。例如,

MyVector(MyVector<T>&& o) 
{ 
    data = o.data; 
    o.data = nullptr; 

    capacity = o.capacity; 
    o.capacity = 0; 

    size = o.size; 
    o.size = 0; 
} 

需要注意的是,爲了使移動構造函數工作,參數不能const。移動構造函數修改它的參數。

+0

哦,所以它是這樣的: MyVector(const MyVector && o)//移動構造函數 { data = o.data; size = o.size; capacity = o.capacity; o.data = null; o.capacity = null; o.size = null; } ? –

+0

@shortage_radeon我添加了一個例子。類型的不變式應該得到尊重,所以你也需要做一些關於'size'和'capacity'的事情。 – juanchopanza

+0

噢,非常感謝,現在我明白了!所以我反其道而行,它被稱爲左側,竊取右側對象的數據。 –

相關問題