我试图在C ++中了解复制构造函数,运算符重载和析构函数。给定一个包含指向它自己类型的指针的类,如何编写复制构造函数或=运算符重载?我尝试了以下方法,但在main中声明或分配Test对象时,我一直遇到分段错误。有谁能解释我做错了什么?
class Test {
public:
Test(string name);
Test(const Test& testObject);
Test& operator=(const Test& rhs);
~Test();
string getName();
void setName(string newname);
Test* getNeighbor(int direction);
void setNeighbor(Test* newTest, int direction);
private:
string name;
Test* neighbors[4];
};
Test::Test() {
name = "*";
neighbors[4] = new Test[4];
}
Test::Test(const Test& testObject) {
this->name = testObject.name;
for (int i = 0; i < 4; i++) {
this->neighbors[i] = testObject.neighbors[i];
}
}
Test& Test::operator=(const Test& rhs) {
if (this == &rhs) {
return *this;
}
else {
name = rhs.name;
delete [] neighbors;
for (int i = 0; i < 4; i++) {
neighbors[i] = rhs.neighbors[i];
}
return *this;
}
}
答案 0 :(得分:0)
您不应删除neighbors
,因为它是静态数组。而是依次删除每个元素。如果它们归当前对象所有,也只删除它们(这在您的代码中并不明显)。
我将创建一个帮助私有函数destroy
并在赋值运算符和析构函数中重用它以避免代码重复。