构成和循环依赖

时间:2011-12-07 22:18:50

标签: c++ smart-pointers composition circular-dependency

  • 频道包含E类型的元素
  • 渠道还有 端口,可以访问
  • 中的元素

看起来应该是这样的:

template<
    typename E>
class IOutPort{
public:

    ...

    /**
    *    Takes an element (chosen by the implementation) that is in channel
    *
    *    @return
    *        The element
    */
    virtual E take() = 0;
};

template<
    typename E>
class IChannel {
public:

    ...

    /**
    *    Gives access to the out port of this channel
    *
    *    @return
    *        A smart pointer to the channel's port
    */
    virtual std::shared_ptr<IOutPort<E>> getOutPort() = 0;
};

他们都需要自己参考..
另外:

  • 在构建时,通道impl无法为端口impl提供自己的shared_ptr(因为它尚未完成)
  • 如果两者都使用强引用,则永远不会被释放
  • 某些用户代码可能希望存储该端口的指针以供以后使用......所以此时该频道必须仍然存在!

使用weak_ptr打破圆圈可能会导致频道过早破坏!

在没有合并两个接口的情况下,哪种模式最好?

修改 @Edwin是的我已经检查了现有的讨论...... 我正在寻找的答案更符合道德而不是技术......

基本上,在C ++这样的语言中,组合的优势在于缺乏内存管理和“C&C”的可用性。在构建时,组合对象何时需要访问作曲家?

我认为唯一的解决方案是实现作曲家和(私下)同一类中的所有组件接口(以解决组件到作曲家的通信问题)。 并且可能提供该独特相同类别的特定视图,使其看起来像是一个&#39; &a;&#39; has-a&#39;关系... 但在这种情况下,所有的构图优势都会丢失!

1 个答案:

答案 0 :(得分:1)

这个问题过于抽象,与申请分开。当您在频道中的内容发生变化,谁负责通过端口传播时会发生什么?应用程序是否会更好地通过流协议而不是面向对象的API提供服务?有多少频道与有多少端口听众?