繁体   English   中英

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

[英]Constructor takes in its own type?

我目前正在尝试为项目创建.cpp文件,但是每当尝试使用提供的测试文件来运行它时,我都会遇到段错误。 我怀疑我已找到错误发生的地方,但我终生无法找到解决方案。

基本上,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
}

那给了我一些编译器错误,编译器甚至都没有去解释...

有人可以澄清这是怎么工作的,如果这首先会引起段错误吗?

您提供的行为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];
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM