2

私はそれを短く明確に保ちます-動的に割り当てられたメモリを練習するために、動的に割り当てられた配列にパラメータ(中心と半径の長さのXとY)を格納する円を作成することにしました。配列は動的に割り当てられるため、リークを止めるにはコンストラクターを実装する必要があります。また、他のいくつかのバグを回避するために、コピー コンストラクターを実装し、代入演算子をオーバーロードする必要があることも意味します。(ほとんど同じコードで)デストラクタをかなりうまく実装したと思います。ただし、コピー コンストラクターについては少し助けが必要です。

#include <iostream>

using namespace std;

class Circle
{
private:
    int* data;
public:
    Circle(){
        cout <<"I am the default constructor" << endl;
        data = NULL;
    }
    Circle(int* p){
        cout <<"I am the set up constructor" << endl;
        data = p;
    }
    ~Circle(){
        cout <<"I am the destructor" << endl;
        delete data;
    }
    Circle& operator=(const Circle& tt1){
        cout << "Overloaded assignment operator reporting in!" << endl;
        if(this != &tt1){
            //free old data
            delete this->data;
            data = new int(3);
           *data = *(tt1.get_data());
            *(arr+1) = *(tt1->get_data()+1);
            *(arr+2) = *(tt1->get_data()+2);
            return *this;
        }
    }
    Circle(const Circle& tt1){
        cout << "I am the copy constructor!" << endl;
        if(this != &tt1){
            //free old data
            delete this->data;
            data = new int(3);
           *data = *(tt1.get_data());
            *(arr+1) = *(tt1->get_data()+1);
            *(arr+2) = *(tt1->get_data()+2);
            return *this;
        }
    }
};

int main(){
    //is this object constructed well?
    int arr [] = { 16, 2, 7};
    Circle a(arr);

    return 0;
}
4

2 に答える 2

4
//is this object constructed well?
int arr [] = { 16, 2, 7};
Circle a(arr);

答えは「はい」と「いいえ」です。コンストラクターは配列のコピーを作成せず、ポインターを配列の最初の要素にコピーするだけです。したがって、Circleクラスに配列を所有させたくない場合は、デストラクタ、コピー コンストラクタ、または代入演算子を提供する必要はありません。

ただし、クラスに配列を所有さたい場合は、配列のローカル コピーを作成して保存する必要があります。これが機能するには、追加の情報が 1 つ必要です。配列のサイズです。配列のサイズは、ポインターを受け取る関数に渡される (およびデストラクタ、コピー コンストラクタ、代入演算子を実装する) と完全に失われます。

これは、入力配列が常にサイズ 3 である場合の動的割り当ての演習であるため、編集してください。これは、配列を取るコンストラクターの例です。

Circle(int* p)
{
  data = new int[3];
  std::copy(p, p+3, data); // UB if p doesn't point to an array of at least 3 elements
}

delete[]を呼び出したので、デストラクタを呼び出す必要がありnew[]ます。

~Circle()
{
    delete [] data;
}

代入演算子を実装するときは、copy and swap イディオムを考慮してください。

于 2013-05-25T06:23:02.320 に答える