1

オブジェクトへのポインターの動的配列のディープ コピーを作成するにはどうすればよいですか? 私はこのコードを信じています。オブジェクトへのポインターに新しいメモリを割り当てているだけですが、それらはまだ同じ場所を指しています。したがって、「コピーされた」画像を変更すると、元の画像も変更され、その逆も同様です。

ありがとう!

宣言:

Class Scene
{
public: 
    .
    .
    .
    .
private:
    Image ** sceneImage;
    int * coordinateX;
    int * coordinateY;
    int inputMax;
};

コピーコンストラクターで...

 Scene::Scene (const Scene & source)
 {
    inputMax = source.inputMax;
    sceneImage = new Image*[inputMax];
    coordinateX = new int[inputMax];
    coordinateY = new int[inputMax];

    // copy even null indexes, because you can put images on null indexes
    for (int i = 0; i < inputMax; i++)
    {
        sceneImage[i] = source.SceneImage[i];
        coordinateX[i] = source.coordinateX[i];
        coordinateY[i] = source.coordinateY[i];
    }
}
4

3 に答える 3

4

のすべての使用をnew[]すぐに削除します。を使用しstd::vectorます。その後、それはあなたのために自分自身をコピーします。さらに、所有するポインターの使用をすべて削除し、スマートポインターを使用します。

于 2012-06-24T20:15:32.500 に答える
2

これにはむしろベクトルを使用することをお勧めします。これらは、ポインタよりも動的配列の方が洗練されており、自動的にコピーされます。

セマンティックに意味がある場合にのみ、ネイキッドポインターを使用します(配列≠ポインター)。これは、C++ではめったに起こりません。

于 2012-06-24T20:15:21.047 に答える
1

ベクトルは良い考えです。しかし、それらを使用するためにすべてのコードをリファクタリングできない場合:

for (int i = 0; i < inputMax; i++)
{
    sceneImage[i] = new Image( *(source.SceneImage[i] ));
    coordinateX[i] = source.coordinateX[i];
    coordinateY[i] = source.coordinateY[i];
}

これらのイメージは後で削除する必要があります。

于 2012-06-24T20:21:16.757 に答える