Is there anyway to avoid this circular reference? I cant use foward declaration, because I am accessing methods of PositionBlock inside PositionBlockIterator...
I know that i can create an interface to PositionBlock, and then use it inside PositionBlockIterator (polymorphism). 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.
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);
}
};
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.