2014-03-04 128 views
0

問題有人能向我解釋爲什麼...與C++模板類初始化

DataStructure<MyClass> ds; 

cin >> size; 
ds = DataStructure<MyClass>(size); 

導致我的程序崩潰,但...

cin >> size; 
DataStructure<MyClass> ds = DataStructure<MyClass>(size); 

不?

我認爲這與我的程序使用默認的構造函數有關,後面嘗試使用隱式拷貝構造函數,但我不確定。

爲了讓更多的背景,我創建一個哈希表類,並在默認的構造函數,我與數據數組初始化爲nullptr並與size參數的構造,我創建一個數據數組new T * [size]和將每個元素設置爲nullptr

Constructor without any parameters: 

this->data = nullptr; 

Constructor with size parameter: 

this->data= new T * [size]; 
for(int i = 0; i< size; i++) 
{ 
    data[i] = nullptr; 
} 
+4

的'DataStructure'模板壞了。將其退還給供應商並要求退款。 –

+0

'Foo a; a = Foo(bar);'!='Foo a = Foo(bar);' – Paranaix

+0

'a'最終是否是相同的值?如果不是,你能解釋爲什麼不? – Mikey

回答

0

您需要聲明一個拷貝構造函數。如果您沒有複製構造函數,則所有成員都將被複制。在你的情況下,data將指向第二類中保留的數據。接下來,這些數據將與班級一起銷燬並指向無所事事。這很可能會導致程序崩潰。 你的拷貝構造函數應該做的深層副本,這樣的事情:

DataStructure(const DataStructure &rhs) 
{ 
    if (this->data) delete[] data; 
    this->data = new T*[rhs.GetSize()]; 
    for (int i=0; i<rhs.GetSize(); i++) 
    { 
     this->data[i] = rhs.data[i]; 
    } 
    return *this; 
} 
+0

我錯誤地認爲這是用隱式拷貝構造函數完成的,所以我不需要編寫一個。謝謝,uncle。。 – Mikey

+0

隱含的是this-> data = rhs.data,但是這些數據可能會在你的rhs對象的析構函數中被刪除。 – uncletall

+0

淺拷貝與深拷貝再次敲擊:'(謝謝你救了我 – Mikey