2017-03-18 7 views
-1

以下の場合があります。それは私がやろうとしているものです:C++でオブジェクトを参照でコピーする方法は?

std::vector <Shape> shapesArr; 
Shape *shape = new Shape(); 
shape->someParam = someValue; 
shapesArr.push_back(Shape); 

// ... 

Shape *shape2 = new Shape(); 
shape2 = shapesArr[ 0 ]; // <-- here I need a copy of that object to shapeA 

delete[] shapesArr; 
delete shape2; // <-- error, because it has already freed. It would be nice if I had a copy of shapesArr[ 0 ] in my shape2 

適切shape2し、そのオブジェクトをコピーする方法は?私は、shapeArr [0]とshape2に別々に格納されるそのオブジェクトの2つのコピーが必要です。

+0

あなたは 'shapes'を' new'で割り当てなかったのですが、なぜ 'delete'を呼び出したいのですか? – Arash

+1

あなたの 'vector'は' Shape'を保存し、ヒープに 'Shape'を割り当て、それを無視し、' push_back'した 'shape'が間違っていても'vector'は' Shape'ではなく 'Shape'を格納しているからです)。ヒープ上にもない 'shapesArr'' vector'を 'delete []'しようとします。このコードは決してコンパイルされません。 [MCVE]を作ってください。これは役に立たない。私はここでの本当の答えは、 "ヒープをまったく使わず、すべてがうまくいく"と思っています。 – ShadowRanger

答えて

3

Shape *shape2 = new Shape(shapesArr[0]);を使用してコピーを作成できます。

あなたのコード内の2個のエラーがあります:まず

:あなたは新しいベクトルがなかったので、あなたはすべてを消去したい場合は

std::vector <Shape> shapesArr; 
Shape *shape = new Shape(); 
shape->someParam = someValue; 
// you should push *shape, because Shape is just the class name 
// and shape is a Shape* type pointer 
// you can shapesArr.push_back(*shape); 
shapesArr.push_back(Shape); 

第二に、あなたは、ベクトルを削除することはできませんベクトル内の要素shapesArr.clear()またはshapesArr.erase(shapesArr.begin(),shapesArr.end());

+0

ありがとう!出来た! – JavaRunner

関連する問題