2012-03-01 2 views
2

私はressourceを持っています。病気になることができるFactoryによって構築されたオブジェクトの共有ポインタ

  1. このリソースは常に存在するとは限りません。時刻は から変更可能です。 (工場)
  2. 一度に1つのオブジェクトだけがこのリソースにアクセスできます(mutexes)
  3. このリソースは異なるオブジェクトによって共有されています。 (スマートポインタ)
  4. このressourceは、何らかの理由で単独で消滅する可能性があります。誰かが "ressource"を外しました。

    <SingleTone>        <Abstract> 
    +------------------------------+     +-----------+    +-----+ 
    ¦   Factory    ¦ *m_pRes  ¦ Ressource ¦ <¦-------- ¦ ResA¦ 
    +------------------------------+ <o>----------> +-----------+    +-----+ 
    ¦ Ressource* createRessource() ¦    ^^
    +------------------------------+     ¦ ¦ 
         ^^          ¦ ¦ 
        <uses> ¦ ¦  +---------+  *m_pRes  ¦ ¦ 
          ¦ +------¦ ObjectA ¦ < >-----------------+ ¦ 
          ¦  +---------+       ¦ 
          ¦  +---------+  *m_pRes    ¦ 
          +--------¦ ObjectB ¦ < >----------------------+ 
            +---------+ 
    

    私は工場出荷時は「新/削除」を担当するようになる:

は、私はこのようになります。心の中でUML設計のようなものを持っています。しかし、私は大きな問題に直面しています。どのようにすべてのオブジェクトは、私は工場からの削除を呼び出すとダングリングポインタを避けるときにressourceにもはや指摘しないことを確認するには?私はまた、 "プロパティリスナー"の一種を実装する必要がありますし、工場から私のressourceを "削除"したいときは、それを無視してポインタを "解放"する(nullに設定します)これはかなり複雑に聞こえる、...

ヤップより良い方法があるかもしれない、私はC++プログラミングを使用します...

答えて

1

あなたは、リソース破壊/作成したイベントがから放出されるevent driven programmingのいくつかの種類を、使用することができます工場。このイベントに関心のあるすべてのオブジェクトは、このイベントに登録されます。イベントハンドラでは、新しいリソースへのポインタを取得できます。

サブスクライバ/パブリッシャオブジェクトにboost::signalsを使用できます。

2

多くのこの問題の解決策の1つはboost weak_ptrです。

リソースが破棄されると、weak_ptrデータメンバーを持つオブジェクトインスタンスは、リソースがなくなったことを検出します。その状態で、彼らは彼らが持っていたロジックを実行しないか、またはいくつかのソースから新しい参照を要求するでしょう。

+0

Yieah nice、新しいコンセプト私は一度も見たことがなく、私の場合に非常によく似ています!学ぶ新しい材料、それは私が探していたもの!ヒントをありがとう! – morandg

2

間接指示の別のレイヤーを追加し、ResourceオブジェクトをRealResourceオブジェクトのプロキシとして動作させることができます。 RealResourceインスタンスが削除/変更された場合は、Resourceオブジェクトのみを更新する必要があります。クライアントは常にResourceプロキシへの有効なポインタを持っています。このポインタは、使用可能な状態かどうかを判断できます。

+----------+   +-----------+   +--------------+  +------+ 
| ClientA |< >---+----| Resource |<o>------| RealResource |<|----| ResA | 
+----------+  | +-----------+   +--------------+  +------+ 
        | | isValid() |   | use()  | 
+----------+  | | use()  |   +--------------+ 
| ClientB |< >---' +-----------+ 
+----------+ 
+0

はい、感謝しました。そのようなレイヤーを置くことも考えていましたが、Ressourceは並行アクセスを管理するためにモニターの処理を行うこともできました。 – morandg

関連する問題