[英]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.