「どうやってやるか」ではなく、「どうやって正しくやるか」が問題
さまざまなウィジェットが子とその (メンバー) 変数を表示する Qt でエディターを開発しています。これらの各ウィジェットは、編集された子への参照/ポインターを保持して、メンバー変数を表示および変更する必要があります。
最初の試みは、私が学んだ古い ANSI C の方法でした (そして、まだ少し行き詰まっています) 使用されたオブジェクトへの単純な生のポインターを使用します。それは正常に動作しますが、C++ 11 標準はスマート ポインターをサポートしており、それらの使用が推奨されているため、それらを使用しようとしています。
問題は、この場合にそれらを使用する「最良の方法」が何であるかがよくわからないことです...スマートポインターを読んだ後:または、あなたの赤ちゃんを所有しているのは誰ですか?いつどの種類のポインターを使用しますか? 他のいくつかは、異なる結論に達しました。
*unique_ptr
編集されたオブジェクトは明らかにその子を作成および削除する所有者であるため、最初の方法は a を使用することです。ウィジェットは、それらを表示または変更するために単に子を参照しています。問題は、ウィジェットが子をどのように参照するかです...
今のところ、get()
メソッドで取得した生のポインターをまだ使用しているだけですunique_ptr
が、これにはちょっと欠陥があるようです。ポインターで誤って削除を呼び出して、スマート ポインターの利点をキャンセルすることはまだあります。
2 番目のアプローチは、shared_ptr
多くのオブジェクトが子を参照して編集するため、a を使用することです。また、1 つのウィジェットでそれを誤って削除しても、他のオブジェクトがまだ所有しているため、害はありません。問題は、彼らがそれを所有していることです。編集したオブジェクトから削除したい場合は、実際に削除する前に、すべてのウィジェットに削除するよう通知する必要があります。(これもまた欠陥があり、エラーが発生しやすいようです)
私は両方の方法に満足していません。unique_ptr
オブジェクトの子を指すよりクリーンな方法はありますか? または、この問題に対する完全に異なるより良いアプローチが欠けていますか?