2014-07-04 71 views
0

有没有办法避免这种循环引用?我不能使用foward声明,因为我正在访问positionBlock在PositionBlockIterator里面的方法...迭代器模式 - 循环引用

我知道我可以创建一个PositionBlock接口,然后在PositionBlockIterator(多态性)中使用它。但还有另一种方式吗?

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); 
    } 
} 

回答

1
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); 
} 

你也可以看到这个编译here。我还建议将两个函数的实现移到单独的*.cpp文件中。

+0

看起来橡胶的问题是专门用'/ *函数... * /',他们没有向我们展示。 :)(我在猜测) –

+0

@DrewDormann:尽管如此,这种模式也能起作用。 –

+0

这就是你如何去做的,但如果你解释为什么*,答案会更好。 –

1

嵌套类应该在这种情况下工作(未测试)。

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); 
    } 
};