【问题标题】:Problems with C++ Class Template InitializationC++ 类模板初始化的问题
【发布时间】:2014-03-04 23:53:12
【问题描述】:

谁能给我解释一下为什么...

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;
}

【问题讨论】:

  • DataStructure 模板已损坏。将其退回给供应商并要求退款。
  • Foo a; a = Foo(bar); != Foo a = Foo(bar);
  • a 的值是否相同?如果不是,你能解释一下为什么不吗?
  • 也许你可以发布你的构造函数和复制构造函数
  • 构造函数贴出来了,我没有拷贝构造函数。

标签: c++ oop templates object


【解决方案1】:

您需要声明一个复制构造函数。如果您没有复制构造函数,则将复制所有成员。在您的情况下,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;
}

【讨论】:

  • 我错误地认为这是使用隐式复制构造函数为我完成的,因此我不需要编写一个。谢谢,uncletall。
  • 隐含的是 this->data = rhs.data,但该数据可能会在 rhs 对象的析构函数中被删除。
  • 浅拷贝与深拷贝又来了:'(谢谢你救了我。
  • 我在前面的数据定义中添加了一个delete[],以防止内存泄漏。检查你是否需要这个。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-13
  • 1970-01-01
  • 2020-10-17
  • 2016-04-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多