2017-07-04 8 views
2

コピーコンストラクタの使い方について質問があります。他にも多くの質問やチュートリアルがありますが、私の問題を完全に解決することはできませんでした。コンストラクタをポインタでコピーする

私はコピーコンストラクタを実装クラスAあります

実行中
A myA; 

Bのメソッドが呼び出されます:別のクラスBで今

A::A(const A& a) { ....... } 

を、私は民間の属性を持っていますAオブジェクトへのポインタで、anAPointerと呼ぶことができます。私は今anAPointerによって指された要素をB::myAにコピーしたいと思います。ポインタの後ろの要素が後で変更された場合、これらの変更がmyA属性に影響しないようにします。

私はthis->myA = A(*anAPointer);をまだ使用しました。これは私が望む効果がありますか?

Bのデストラクタでdelete myAに電話する必要がありますか?

+0

'this-> myA = * anAPointer;' – Jonas

+0

* Bのデストラクタでdelete myAを呼び出さなければなりませんか? - コンテキストが何であるかは誰も知りませんあなたのオブジェクトがどのように使用されているかを示します。あなたが[mcve]を投稿しない限り、誰もあなたに明確な答えを与えることはできません。 – PaulMcKenzie

+0

@PaulMcKenzie 'myA'は、OPの非ポインタ属性として明示されていますので、回答することができます – wasthishelpful

答えて

2

あなたのコード:

A(*anAPointer) 

は、コンストラクタをコピーするので、this->myAanAPointerが指す値とは無関係のAのインスタンスになりますA年代を呼んでいます。あなたのクラスAが共有リソースを扱わない限り、最初のものへの変更は他のものに(そしてその逆も)伝播されませんが、それはあなたの質問で指摘されていません。

myAはポインタではないので、Bのデストラクタでdeleteを呼び出す必要はありません。

Aにコピーコンストラクタを実装する場合は、rule of 3/5/0と、おそらくcopy and swap idiomを考慮する必要があります。

+0

あなたの答えをありがとう!だから、私はすべてが正しかった? – lukasl1991

+0

あなたの質問からあなたが私にしたように見えます。 )確かにいくつかのテストを行います; – wasthishelpful

+0

'A 'が実際に行うことに応じて、3/5/0のルールとデザインのコピーとスワップイディオムも考慮してください。私の編集された答えをリンクで見る – wasthishelpful