2012-01-11 7 views
0

セイ、:間接マルチレベルのスマートポインタは

weak_ptr<Style> A -> weak_ptr<Style> B -> shared_ptr<Style> C 

は、あなたがそのような方法で(観察)新しいshared_ptrの(C)を指すように第二のweak_ptr(B)を変更できますそれでも最初のweak_ptr(A)が新しいshared_ptr(C)の変更を見ますか?

希望は意味があります。この場合、weak_ptrが提供できる安全性を考えれば、私は未加工のポインタから離れていきたいと思います。

編集:私はweak_ptrを演算子=基本的にただのコピー別のweak_ptrをしていないが、実際には別のweak_ptrを観察作ることを実現

再読み込みブーストドキュメントの後。したがって、生ポインタのないこの種の間接参照を持つことはできません。

編集2:

私の問題に拡大するために:私はLabelを持っているとGlyphLabelGlyphのコンテナです。ラベルにはshared_ptr<Style>があり、グリフにはこのスタイルに対してweak_ptrがあります。私の意図は、実際にすべてのラベルのグリフを反復することなく、スタイルを素早く変更できるようにすることです。だから私はLabelに別の「アクティブな」スタイル(スタイルペンシルのようなもの)を持っていて、すべてのグリフをそのペンシルのものを指すように考えていました。だから、私がスタイルの変更が必要なときは、新しいスタイルオブジェクトにペンシルを単に割り当てます。これはスマートなポインタでのみ行うことができますか、生のポインタをどこかに混在させる必要がありますか?

+2

申し訳ありませんが、私にはこれは意味をなさない - あなたの意図をコードで表現できますか? –

+0

詳細情報で質問を更新しました:) – Sim

答えて

1

あなたのオブジェクトがスタイルにshared_ptrを持ち、それが同じスタイルである場合、それらのオブジェクトの間でこのStyleオブジェクトの存続時間を処理します。ただし、それらは同じオブジェクトへの参照を共有するので、スタイルを変更すると、それらのすべてが変更されたスタイルへのポインタを持つようになります。

スタイルシートのテーブルがどこかにあり、これがあなたのアイテムよりも長持ちするメインコンテナである場合、参照を保持する必要がある危険がない限り、アイテムにスマートポインタを持たせる必要はありませんこのスタイルに変換し、テーブルから削除したり、テーブルが消えたりしても使用します。

一般的には、瞬間的なことを忘れて、オブジェクトの所有権について何を考えていますか。

+0

あなたの答えは私のグリフデザインをもう一度見てくれました。そして、うん、グリフがどんなスタイルオブジェクトをも観察するのは実際には意味がありません。グリフは描画専用のスタイルを必要とするため、関数の引数で渡すことができます。 – Sim

1

ローポインタは必要ありません。 必要な行動パターンを検討することは価値があります。 いくつかの提案は次のとおりです。

  1. グリフは、ラベルの内部にあるラベルが死ぬとき、彼らは露出して死ぬことはありません。 スタイルプロパティは変更されますが、スタイルインスタンスは一定です。 このパターンでは、各クラスで1つのレベルのshared_ptrを使用するのが最も簡単な解決方法です。 グリフがスタイルの存続期間を延長し、すべてのshared_ptrsが同じインスタンスを指すことはありません。

  2. グリフはラベルの内部にあり、ラベルが消滅したときには露呈せず死ぬ。 スタイルインスタンスを変更できます。 この場合、ラベルはスタイルへのプロキシを保持できます(私はあなたの鉛筆のコンセプトはスタイルへのプロキシであると思います)。メンバーとしてのスタイルへの単一のshared_ptrを持つ単純なクラスです。プロキシはshared_ptrに保持する必要があります。各Glyphは、shared_ptrをプロキシのインスタンスに保持できます。

  3. グリフはラベルの内部には存在しないため、ラベルがなくなってもスタイルにアクセスできるようにする必要があります。 #1と#2のデザインは引き続き動作します。

  4. グリフはラベルの内部には存在しませんが、それらは公開されていますが、スタイルの有効期間がラベルの有効期間を超えてはなりません。 この場合、#1または#2のパターンに従ってください。ただし、Glyphはstyle/proxyインスタンスへのshared_ptrではなく、スタイル(#1)またはプロキシ(#2)インスタンスに対してweak_ptrを使用する必要があります。

あなたがしたい場合は、プロキシへのshared_ptrへのshared_ptrを持つ(というよりもカスタムクラスを記述する)ことで、プロキシを実装することができますが、これは従って、コードが難しいことがあります。この方法でネストする場合は、テンプレートタイプに注意してください.2番目のレベルの場合は、shared_ptr<Foo>ではなく実際にはshared_ptr<shared_ptr<Foo>>が必要です。