0

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);
   }
}
p.magalhaes
  • 7,595
  • 10
  • 53
  • 108

2 Answers2

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

You can also see this compiling here. I'd also recommend moving the implementations of the two functions into separate *.cpp files.

Bill Lynch
  • 80,138
  • 16
  • 128
  • 173
1

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);
  }
};
user1034772
  • 516
  • 1
  • 5
  • 12