由Factory构建的对象的共享指针可以消失

时间:2012-03-01 18:18:16

标签: c++ pointers uml factory

我有一个资源,让我们说一个串口。

  1. 此资源可能并不总是存在,可能会随时间而变化 时间。 (工厂)
  2. 只有一个对象可以一次访问此资源(互斥锁)
  3. 此资源由不同的对象共享。 (智能指针)
  4. 由于某些原因,这个资源本身可以解决,有人拔掉了“资源”。
  5. 我有一种UML设计,如下所示:

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

    我会让工厂负责“新/删除”。但是,我面临一个大问题。当我从工厂调用delete并避免悬空指针时,如何确保所有对象都不再指向该ressource?我是否还应该实现一种“属性监听器”,当我想从我的工厂“删除”我的资源时,向所有持有者发出信号,表示它不顾及“释放”指针(将其设置为空)?这听起来很复杂,可能有更好的方法......

    是的,我将使用C ++编程......

3 个答案:

答案 0 :(得分:2)

此问题中的一个解决方案可以使用boost weak_ptr

当资源被销毁时,具有weak_ptr数据成员的对象实例会发现资源已经消失。在这种情况下,他们要么不执行他们原有的逻辑,要么从某个来源请求新的引用。

答案 1 :(得分:2)

您可以添加另一层间接,并使Resource对象充当RealResource对象的代理。删除/更改RealResource实例时,只需要更新Resource对象。客户端总是拥有一个指向Resource代理的有效指针,可以判断它是否处于可用状态。

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

答案 2 :(得分:1)

您可以使用某种event driven programming,其中从工厂发出资源销毁/创建的事件。对此事件感兴趣的所有对象都会注册到它。在事件处理程序中,他们可以获得指向新资源的指针。

您可以将boost::signals用于订阅者/发布者对象。