2012-03-01 14 views
1

に1つのポインタから内容をコピーしますか?は、私は2クラスを持っている別の

変更する必要はありませんResponse.dimensionRequest.dimensionにも影響します。

これを行う方法はありますか? KeyValuePairはPOD型でない場合、それは割り当て中に呼び出されますよう、あなたは、代入演算子(operator =)を定義する必要があること

*(res.dimension) = *(req.dimension); 

注:

void Transformation::applyTransformations(const Request& req, Response& res) 
{ 
    res.dimension = req.dimension; // WRONG. Pointing the same address. 
} 
+0

「KeyValuePair」はどのように定義されていますか?それは適切な(コピー)コンストラクタを持っていますか? –

+0

コピーコンストラクタが正しく定義されている場合は、 'res.dimension = new KeyValuePair(req.dimension);'を実行できます。 – jogojapan

答えて

2

はい、もちろん。そうしないと、コンパイラ生成のものが呼び出されます。

あなたはまたres.dimensionが適切に割り当てられている場合ではない場合は、チェックコピーコンストラクタを使用する必要があります。

if (res.dimension) 
    *(res.dimension) = *(req.dimension); 
else 
    res.dimension = new KeyValuePair(*(req.dimension)); 
+2

これは、ストレージが '*(res.dimension)'のために割り当てられていると仮定していますが、そうではない可能性があります。 –

+0

@PaulRあなたが正しいです、私は私の答えを編集しました。 –

+0

申し訳ありません。 PODとは何ですか?私は質問に自分のKeyValuePairを入れるように更新しました。 KeyValuePairがPODではないとすると、代入演算子を定義するチュートリアルを表示できますか?ありがとう! – Rudy

1

あなたはrequest.dimensionの深いコピーを実行するために、あなたのResponseクラスの=演算子をオーバーロードすることができ、この意志Response.dimensionRequest.dimensionと同じ値になりますが、Request.dimensionの変更とは関係ありません。あなたが新しいメモリを割り当てる必要が

+0

もちろん、彼は割り当て時にポインタを逆参照することを覚えておく必要があります。 –

0
+0

デフォルトのコンストラクタ –

+0

これは実際には有用な答えではありません。ほとんどの場合*単なるリンク以上のものでなければなりません。 –

+0

[たくさん](https://www.google.com/search?q=c%2B%2B+copy+constructor&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:es-ES:official&client = firefox-a) – m0skit0

0

。また、コピーコンストラクタを持つ必要があります(または、必要に応じてデフォルトコンストラクタを使用します)。

res.dimension = new KeyValuePair(req.dimension);

また、あなたはすなわち、コピーコンストラクタ、コピー作業、空のコンストラクタとデストラクタを定義するメモリを処理する必要があります。

0

不要なオーバーヘッドを避けるために、 'copy on write'ポインタを実装できます。

関連する問題