RAIIは、スコットマイヤーズが指摘するように、誤って名前が付けられています。
「Resource Acquisition is Initialization」と呼ぶべきではありません。「Destruction is Resource Release」と呼ばれるべきです。しかし、私たちはどこにいるのですか?
セルがrepresentation_
が指し示すオブジェクトを所有し、そのデストラクタで削除した場合、これはヌルポインタでshared_ptr
を初期化してから後で設定できるのと同じ方法でRAIIの形式ですそれは別のものに。私はあなたがそれを正しく使用すると仮定します(オブジェクトがいくつかのセルに保存されていることを確認した後、コンストラクタの完了とポインタの格納の間に最終的に解放される間に失敗することはありません)。もしそうなら、RAIIの重要な部分を使用しています。たとえそれが作業を行っているコンストラクタではありません。
これはおそらく単一責任の原則に違反していると思われます。 Cellをセルの代理にするようにしましたが、QAbstractGraphicsItem
というオブジェクトをメモリ管理するためにものオブジェクトにする必要があります。おそらくrepresentation_
をスマートポインタ型に変更することを単純化するので、Cellのデストラクタに特別なコードは必要ありません。
セルがrepresentation_
が指し示すオブジェクトを「所有していない」場合、それは本質的にRAIIに違反するものではなく、実装していないだけです。他の何かがオブジェクトの所有権を担う必要があります。おそらく他のものがRAIIを使用しているかもしれません。 Cellが必要とする限り、オブジェクトの存続を保証するためには、Cellのライフサイクルに何らかの形で関与する必要があります(たとえば、セルを所有している場合は問題ありません)。そうでなければ、何とかRAIIに違反している可能性があります。
ここでRAIIのどの部分が壊れていると思われますか? –
representation_メンバーはほとんどの場合0であり、初期化されません。 – problemofficer
これは、RAIIのパラダイムよりもMVCのパラダイムを壊すと思います。 – filipe