我有一个资源,让我们说一个串口。
我有一种UML设计,如下所示:
<SingleTone> <Abstract>
+------------------------------+ +-----------+ +-----+
¦ Factory ¦ *m_pRes ¦ Ressource ¦ <¦-------- ¦ ResA¦
+------------------------------+ <o>----------> +-----------+ +-----+
¦ Ressource* createRessource() ¦ ^ ^
+------------------------------+ ¦ ¦
^ ^ ¦ ¦
<uses> ¦ ¦ +---------+ *m_pRes ¦ ¦
¦ +------¦ ObjectA ¦ < >-----------------+ ¦
¦ +---------+ ¦
¦ +---------+ *m_pRes ¦
+--------¦ ObjectB ¦ < >----------------------+
+---------+
我会让工厂负责“新/删除”。但是,我面临一个大问题。当我从工厂调用delete并避免悬空指针时,如何确保所有对象都不再指向该ressource?我是否还应该实现一种“属性监听器”,当我想从我的工厂“删除”我的资源时,向所有持有者发出信号,表示它不顾及“释放”指针(将其设置为空)?这听起来很复杂,可能有更好的方法......
是的,我将使用C ++编程......
答案 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用于订阅者/发布者对象。