我目前正在尝试为项目计算一个.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
}
这只是给了我一些编译器错误,编译器甚至懒得解释......
有人可以澄清这是如何工作的,如果这首先会导致段错误吗?
答案 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];
}
}