1

C++ のコピー コンストラクター、演算子のオーバーロード、およびデストラクタに頭を悩ませようとしています。独自の型へのポインターを含むクラスが与えられた場合、コピー コンストラクターまたは = 演算子のオーバーロードをどのように記述しますか? 次のことを試みましたが、メインで 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 に答える