最近、このデータ構造に似たものが必要な状況に頻繁に遭遇しています。
制限:C++03標準。
+-----+--------------+ +----+
|node0| NodeDataRef ->-------------->|data|
+-----+--------------+ +----+
+-----+--------------+ ^^ ^
|node1| NodeDataRef ->----------------+| |
+-----+--------------+ | |
+-----+--------------+ | |
|node2| NodeDataRef ->-----------------+ |
+-----+--------------+ |
|
+-----+--------------+ |
|root | RootDataRef ->-------------------+
+-----+--------------+
- いくつかの
Node
クラスがあり、それぞれが「」の同じインスタンスへの「参照」(think )をNode
保持します(クラス、構造、何でも-動的に割り当てられます)。NodeDataRef
shared_ptr
Data
- 同じ""への参照(今回はthink )を保持する"
Root
"または"master"ノード/クラスもあります。RootDataRef
weak_ptr
Data
- すべて
Node
のsが破棄されると、data
も破棄され、 /RootDataRef
に設定されます。つまり、のように振る舞い、0
NULL
NodeDataRef
shared_ptr<Data>
RootDataRef
weak_ptr<Data>
- ただし、ルートノードは、アクティブながまだ存在する場合でも、データを強制的に破棄する可能性があります
NodeDataRef
。この状況NodeDataRef
では、データを指していたすべてのsが/に設定され、NULL
また/0
に設定RootDataRef
されます。0
NULL
つまりweak_ptr<Data>
、リンクされているすべてのを強制的に破壊することができますshared_ptr<Data>
。
- このパターン/スマートポインタタイプには名前がありますか?
- BoostまたはQt4を使用してこれをすばやく実装するにはどうすればよいですか?(「迅速に」とは、参照のリストを維持するためのクラスを作成しないことを意味します)