简体   繁体   English

迭代器模式-循环引用

[英]Iterator Pattern - Circular Reference

Is there anyway to avoid this circular reference? 无论如何,有没有避免这种循环引用? I cant use foward declaration, because I am accessing methods of PositionBlock inside PositionBlockIterator... 我无法使用前向声明,因为我正在访问PositionBlockIterator中的PositionBlock方法...

I know that i can create an interface to PositionBlock, and then use it inside PositionBlockIterator (polymorphism). 我知道我可以创建一个与PositionBlock的接口,然后在PositionBlockIterator(多态性)中使用它。 But is there another way? 但是还有另一种方法吗?

class PositionBlockIterator{
private:
   PositionBlock *posBlock;
public:
     PositionBlockIterator(PositionBlock *posBlock_){
         posBlock = posBlock_;
     }
     /* functions to iterate over positionblock, using posBlock->... */
}

class PositionBlock
{
public:
   PositionBlockIterator * createIterator(){
       return PositionBlockIterator(this);
   }
}
class PositionBlock;
class PositionBlockIterator;

class PositionBlockIterator{
    private:
        PositionBlock *posBlock;

    public:
        PositionBlockIterator(PositionBlock *posBlock_);
};

class PositionBlock {
    public:
        PositionBlockIterator * createIterator();
};

PositionBlockIterator::PositionBlockIterator(PositionBlock *posBlock_) {
    posBlock = posBlock_;
}

PositionBlockIterator * PositionBlock::createIterator(){
    return new PositionBlockIterator(this);
}

You can also see this compiling here . 您也可以在这里查看此编译。 I'd also recommend moving the implementations of the two functions into separate *.cpp files. 我还建议*.cpp两个功能的实现转移到单独的*.cpp文件中。

A nested class should work in this situation (not tested). 嵌套类应在这种情况下工作(未经测试)。

class PositionBlock{
public:
  class Iterator{
  private:
     PositionBlock *posBlock;
  public:
    Iterator(PositionBlock *posBlock_){
       posBlock = posBlock_;
    }
    /* functions to iterate over positionblock, using posBlock->... */
  };

  Iterator * createIterator(){
     return new Iterator(this);
  }
};

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM