----
class Date;        //forward class declaration
Date returnADate();   //fine - no definition
void takeADate(Date e);        //of Date is needed
bool checkDate(Date& d);
----

Three rules have to be applied :

* Avoid using objects when object references and pointers will do.
You may define references and pointers to a type with only a declaration for the type. Defining objects of a type necessitates the presence of the type's definition.

* Use class declarations instead of class definitions whenever you can.
Note that you never need a class definition to declare a function using that class, not even if the function passes or returns the class type by value.

* Don't #include header files in your header files unless your headers won't compile without them.
Instead, manually declare the classes you need, and let clients of your header files #include the additional headers necessary to make their code compile.

