There are circumstances in which classes refer to one another:
//file: bank.h
class Report{
public:
void Output(const Account& account); // compile time error; class Account is not declared yet
};
class Account {
public:
void Show() {Report::Output(*this);}
};
However, an attempt to compile this header file will cause compile time errors, since the compiler does not recognize the symbol Account as a class name when class Report is compiled. Even if we re-locate the declaration of class Account and place it before class Report, we'll encounter the same problem: class Report is referred to from Account. For that purpose, forward declarations are required. A forward declaration instructs the compiler to hold off reporting errors until the entire source file has been fully scanned:
//file: bank.h
class Acount; //forward declaration
class Report{
public:
void Output(const Account& account); //fine: Account is known to be a not-yet defined class
};
class Account {
Report rep;
public:
void Show() {Report::Output(*this);}
};