构造函数采用自己的类型?

时间:2014-02-26 02:11:57

标签: c++ constructor segmentation-fault

我目前正在尝试为项目计算一个.cpp文件,但每当我尝试使用提供的测试文件来运行它时,我就会出现seg错误。我怀疑我已经找到了错误发生的地方,但我不能为我的生活找到解决方案。

基本上,类Product在测试文件中初始化,如下所示

Product * orderItem = new Product(*wonkaBar_retail);

其中wonkaBar_retail是一个指向Product对象的指针 - 所以基本上,Product的构造函数接受了一个自己类型的对象......我甚至不确定它应该工作。正如我所说,这段代码,包括实例化wonkaBar_retail的部分,所以我尝试通过制作像这样的构造函数进行补偿

Product(Product) {
//Constructor in the header file
}

甚至喜欢这个

Product(const Product&) {
//Other style
}

这只是给了我一些编译器错误,编译器甚至懒得解释......

有人可以澄清这是如何工作的,如果这首先会导致段错误吗?

1 个答案:

答案 0 :(得分:3)

您提供的行使用复制构造函数作为类Product,这是完全合法的。实际上,如果您没有为类提供自己的复制构造函数,编译器将为您生成一个。

复制构造函数接受对同一类型的另一个对象的引用,并将新对象初始化为与另一个对象相同的状态。复制构造函数签名通常如下所示:

Product(const Product& other);

对于简单类,编译器生成的复制构造函数可以正常工作,但对于非平凡的类,例如包含动态分配对象的指针,你应该实现自己的。

考虑以下课程:

class Buffer
{
public:
    Buffer(int dataSize) : m_dataSize(dataSize) { m_data = new char[m_dataSize]; }
    ~Buffer() { delete[] m_data; }

private:
    int m_dataSize;
    char* m_data;
};

此类的默认复制构造函数如下所示:

Buffer::Buffer(const Buffer& other)
{
    m_dataSize = other.m_dataSize;
    m_data = other.m_data;

}

这显然不是你想要的。例如,如果您复制的对象被删除,则新对象指向的数据也将被删除。然后,当您删除新对象时,您将尝试两次删除相同的数据,这非常糟糕。

你真正想做的是为你的新对象分配新的m_data并从另一个对象复制数据,如下所示:

Buffer::Buffer(const Buffer& other)
{
    m_dataSize = other.m_dataSize;
    m_data = new char[m_dataSize];
    for (int i = 0; i < m_dataSize; ++i)
    {
        m_data[i] = other.m_data[i];
    }
}
相关问题