Yeah,
what happens wit circular dependency is the compiler goes through ball.h
when it gets to #include "paddle.h" it will go into paddle.h to see what's in there. Then inside Paddle.h it will get to #include "Ball.h" and it will go inside Ball.h and get to #include "paddle.h" and...... you see the point
When you do forward declaration like class Paddle; you're basically just promising the compiler that a class Paddle exists.
from wikipedia
"Circular dependencies can cause many unwanted effects in software programs. Most problematic from a software design point of view is the tight coupling of the mutually dependent modules which reduces or makes impossible the separate re-use of a single module.
Circular dependencies can cause a domino effect when a small local change in one module spreads into other modules and has unwanted global effects (program errors, compile errors). Circular dependencies can also result in infinite recursions or other unexpected failures.
Circular dependencies may also cause memory leaks by preventing certain very primitive automatic garbage collectors (those that use reference counting) from deallocating unused objects."