Общие указатели объектов, построенных Фабрикой, которые могут исчезнуть - PullRequest
2 голосов
/ 01 марта 2012

У меня есть ресурс, скажем, последовательный порт.

  1. Этот ресурс может присутствовать не всегда и может время от времени меняться.(фабрика)
  2. Только один объект может получить доступ к этим ресурсам одновременно (мьютексы)
  3. Этот ресурс совместно используется различными объектами.(умные указатели)
  4. Этот ресурс по каким-то причинам может исчезнуть сам по себе, кто-то отключил его от источника.:
        <SingleTone>                               <Abstract>
    +------------------------------+                 +-----------+              +-----+
    ¦         Factory              ¦   *m_pRes       ¦ Ressource ¦   <¦-------- ¦ ResA¦
    +------------------------------+  <o>----------> +-----------+              +-----+
    ¦ Ressource* createRessource() ¦                  ^    ^
    +------------------------------+                  ¦    ¦
              ^ ^                                     ¦    ¦
      <uses>  ¦ ¦      +---------+     *m_pRes        ¦    ¦
              ¦ +------¦ ObjectA ¦ < >-----------------+    ¦
              ¦        +---------+                         ¦
              ¦        +---------+      *m_pRes             ¦
              +--------¦ ObjectB ¦ < >----------------------+
                       +---------+
    

    Я позволю фабрике отвечать за "новый / удалить".Однако я столкнулся с большой проблемой.Как убедиться, что все объекты больше не будут указывать на этот ресурс, когда я буду вызывать delete из Factory и избегать висящего указателя?Должен ли я также реализовать своего рода «прослушиватель свойств», и когда я хочу «удалить» свой ресурс из моей фабрики, сообщить всем держателям, что он исчезает, и «освободить» указатель (установить его в ноль)?Это звучит довольно сложно, возможно, есть лучший способ ...

    Да, я буду использовать программирование на C ++ ...

Ответы [ 3 ]

2 голосов
/ 01 марта 2012

Одно из многих решений этой проблемы могло бы использовать boost, слабый_птр .

Когда ресурс уничтожен, экземпляры объектов с членами-данными типа weak_ptr обнаружат, что ресурс пропал.При этом условии они либо не будут выполнять логику, которую они будут иметь, либо запросят новую ссылку из какого-либо источника.

2 голосов
/ 01 марта 2012

Вы можете добавить еще один слой косвенности и заставить объект Resource выступать в качестве прокси для объекта RealResource.При удалении / изменении экземпляра RealResource необходимо обновить только объект Resource.Клиенты всегда имеют действительный указатель на прокси Resource, который может определить, находится он в рабочем состоянии или нет.

+----------+           +-----------+         +--------------+      +------+
| ClientA  |< >---+----| Resource  |<o>------| RealResource |<|----| ResA |
+----------+      |    +-----------+         +--------------+      +------+
                  |    | isValid() |         | use()        |
+----------+      |    | use()     |         +--------------+
| ClientB  |< >---'    +-----------+
+----------+
1 голос
/ 01 марта 2012

Вы можете использовать какое-то событийное программирование , когда уничтоженные / созданные ресурсом события генерируются фабрикой.Все объекты, заинтересованные в этом событии, будут зарегистрированы на нем.В обработчиках событий они могут получать указатели на новый ресурс.

Вы можете использовать boost :: сигналов для объекта подписчика / издателя.

...