2014-03-04 123 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