what is the the best practice of solving circular dependency in C++
?
I could use the forward declaration, but then I get the pointer to incomplete
You just need to use forward declaration correctly:
Note: Add include guards.
Its hard to actually do it without the actual declarations. The diagram is nice but does not have enough information. A picture may be worth a thousand words, but a precisely defined language can convey more exact information very compactly (unlike English and its inconsistencies).