class Person{
public:
Person(const std::string& name, const Date& birthday, const Address& addr);
std::string name() const;
std::string birthDate() const;
std::string address() const;
...
private:
std::string theName;
Date theBirthDate;
Address theAddress;
};
Here, class Person can't be compiled without access to definitions for the classes the Person implementation uses, namely, string, Date, Address. Such definitions are typically provided through #include directives, so in the file defining the Person class, you are likely to find something like this:
#include<string>
#include "date.h"
#include "address.h"
Unfortunately, this sets up a compilation dependency between the file defining Person and these header files. If any of these header files is changed, or if any of the header files they depend on changes, the file containing the Person class must be recompiled, as must any files that use Person.