2014-07-04 91 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); 
    } 
};