1

我试图了解 C++ 中的复制构造函数、运算符重载和析构函数。给定一个包含指向它自己类型的指针的类,如何编写复制构造函数或 = 运算符重载?我尝试了以下操作,但在 main.js 中声明或分配 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;
    }
}
4

1 回答 1

0

您不应该删除neighbors,因为它是一个静态数组。而是依次删除其每个元素。如果它们由当前对象拥有,也仅删除它们(这在您的代码中并不明显)。

我将创建一个辅助私有函数destroy并在赋值运算符和析构函数中重新使用它以避免代码重复。

于 2013-11-11T18:43:41.177 回答