2011-07-17 8 views
0

コンストラクタがnewを呼び出す(つまり、コンストラクタが別のものを動的に割り当てる必要がある)型を持つ+演算子をオーバーライドしようとしています。 。私の問題は、私は明らかに+関数内型Tのオブジェクトを作成する必要があるということですC++で動的に割り当てられた型のオーバーロード+演算子

T c = a + b; 

:どこか、私は次のようなものを使用することができるようにしたいと思います。 by-copyを返すために+関数実装内のスタックにTの一時インスタンスを割り当てた場合、このインスタンスのデストラクタは+ call exitとして呼び出され、cへの代入の前に(つまり私は信じています)。それはオプションではありません。私の他のオプションは、newを使用して、返すときにnewによって返されたポインタを逆参照するように思われます。しかし、このアプローチの問題は、ポインタがアクセス不能になり、その上にdeleteを呼び出す方法がないということです。

私の質問は...ダイナミックな割り当てを伴うタイプの演算子のオーバーロードがまれであるということはできません。どのように人々は一般的にこのような状況に対処しますか?

+0

私はこの問題を理解していません。あなたの型 'T'がそのコンストラクタに' new'を、デストラクタで 'delete'を持っていれば、一部のメンバーにとって何が問題なのですか? –

+0

私はT c = a + bと書いておきたいと思います。問題は、+関数がT型のオブジェクトを返す必要があるということです。このオブジェクトはどこで作成しますか? +関数のスタック上では機能しません - スコープから外れるときに削除されます。これは、必要な割り当ての直前に+関数から戻ったときです。新しいキーワードを使用して、戻ったときに逆参照する必要がありますか?しかし、私はnewによって返されたポインタを回復することはできませんでした。私はそれを削除することができず、メモリリークの原因となりました。 – Gravity

+0

Hmmm ... copyコンストラクタはcopyで値を返すときに自動的に呼び出されますか?そのようなものは、私が仕事をしようとしているものを作るために必要であろう。 – Gravity

答えて

3

TがThe Rule of 3に従っていることを確認してください。心配はありません。

+0

リンクありがとうございました。あなたのリンクは、私がコピーコンストラクタを作っていないので、私のコードが奇妙なメモリエラーになりやすいことを認識させました。私が直接綴った心配はどうですか?なぜ3つのルールに従えば、私は上記で概説した状況から私を救うでしょうか? – Gravity

+0

@Gravity: 'return'は戻り値のコピーを作るので(NRVOが起こらない限り、@ tgの答えを見てください。しかし破壊は遅れます)。 –

+0

今、わかりました。ビットごとの(Cスタイルの)コピーを行う代わりに、コピーコンストラクタを呼び出して返すことがわかりませんでした。 – Gravity

0

std::stringstd::vectorは何とかできて、あなたのクラスもそうです。私はあなたがソースコードを学ぶことを示唆していません、それは非常に威圧的です。別のポスターが言ったように、3のルールはあなたの友人です。私はあなたがでないことを追加することができますnewあなたの機能で呼び出します。スタックに割り当てて値で返します。 C++は必要な魔法を実行します。

3

あなたは、コンパイラに依存して、オペレータの実装、出口で、その後、operator+内スタック上に一時オブジェクトを作成する場合:

渡されるオブジェクトが別の一時オブジェクトにコピーコンストラクタを介して渡されます
  1. 、再度コピーコンストラクタ経由でcに転送してください。 または
  2. オブジェクトはコピーコンストラクタ経由でcに渡されます。 OR
  3. 一時オブジェクトは実際にはcであり、コピーコンストラクタコールはありません。前に述べたように、あなたが3のルールに従い、コピーコンストラクタと代入演算子の正しい実装を提供する場合がどのような状況下で、何の問題もないので、あなたが心配する必要はありません、

http://en.wikipedia.org/wiki/Return_value_optimizationを参照してください)実際の実装について(あなたがパフォーマンスに夢中ならない限り)。それはOOPに関するすべてです。

+0

+1。私の問題は、私はちょうどコピーを渡すことがどのように働いたのか分からなかったということでした。 – Gravity

関連する問題