Friend Classes
When a class (declaring class) declares another class
(friend class) to be a friend, the friend class' member
functions can invoke the protected or private member
functions or use the protected or private data members of
the declaring class.
To do so, the friend class must have access to an object of
the declaring class' type.
This can be done by having an object of the friend class
as a data member or a pointer to an object of the friend
class.