私はWidget
というクラスを持っています。このクラスは抽象クラスで、仮想メソッドがあります。オブジェクトのスライスを避けるために、すべてWidgets
は参照またはポインタとして格納されます。私はそれらに与えられたウィジェットを内部的に格納するコンストラクタを持ついくつかのクラスを持っています。したがって、格納されたWidget
は、コンストラクタの外で初期化されていなければならず、オブジェクトが存在する前に破棄することはできません。したがって、通常はWidget
が動的メモリを介して割り当てられます。私の質問は、この動的メモリをどのように扱うかに関するものです。私はオプションのリストを編集しました(他の人を自由に提案してください)。どちらが最も慣用的ですか?多型及びリソース管理に関するプログラム設計
1.スマートポインタ。スマートポインタは正しい選択肢のようですが、私はC++ 98を使用しているので、自分で書く必要があります。私もいつもsmart_pointer<Widget>
と書いているのはちょっと醜いと思います。
2.保存時にWidgets
をコピーします。もう1つの方法は、元の代わりに渡されたWidget
のコピーを保存することです。これはオブジェクトのスライスを引き起こす可能性がありますが、わかりません。また、ユーザは、Widgets
が渡されたクラスを自分自身で書きたいと思うかもしれません。複雑すぎることは望ましくありません。
3.ユーザーがすべてを処理するようにします。おそらく、Widget
が時間通りに削除されることをユーザーに確認させることができます。これはQtのようなものです(?)。しかし、これはユーザのために物事を複雑にする。
スマートポインタを使用します。欠陥があっても 'std :: auto_ptr'があります。 'std :: auto_ptr'がジョブを実行しない場合は、ジョブを書き込むか、すでに書き込まれているものを探します。 – Galik
そして、 'typedef unique_pointer WidgetUPtr;'のようなものを使って、より冗長な入力をすることができます。 –
Galik
また、別のオプションは 'clone'イディオムです。 https://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Virtual_Constructor。オブジェクトのスライスを避けるために*オプション2 *で使用できます。 –