关于Effective C++ 2nd-条款34 将文件之间的编译依赖关系(compilation dependencies)降至最低,该怎么解决

关于Effective C++ 2nd--条款34 将文件之间的编译依赖关系(compilation dependencies)降至最低
尽量以class声明取代class的定义。
源码如下:
//Date.h
#ifndef   DATE_H_
#define   DATE_H_

class   Date
{
public:
Date();
virtual   ~Date();
};

#endif   /*DATE_H_*/

//Address.h
#ifndef   ADDRESS_H_
#define   ADDRESS_H_

class   Address
{
public:
Address();
virtual   ~Address();
};

#endif   /*ADDRESS_H_*/

//Country.h
#ifndef   COUNTRY_H_
#define   COUNTRY_H_

class   Country
{
public:
Country();
virtual   ~Country();
};

#endif   /*COUNTRY_H_*/

//Person.h
#ifndef   PERSON_H_
#define   PERSON_H_

#include   <string>

//#include   "Date.h "
//#include   "Address.h "
//#include   "Country.h "

class   Date;
class   Address;
class   Country;

class   Person
{
private:
std::string name_;
Date birthDate_;
Address address_;
Country citizenship_;
public:
Person();
virtual   ~Person();
};

#endif   /*PERSON_H_*/

//main.cpp
#include   "Person.h "

int   main()
{
return   0;
}


使用MinGW3.4.4编译,失败,
error:   field   `address_ '   has   incomplete   type dependence Person.h
error:   field   `birthDate_ '   has   incomplete   type dependence Person.h
error:   field   `citizenship_ '   has   incomplete   type dependence Person.h

貌似没有书上说得那么理想,没有调用class的方法,依赖声明都不可以吗?

------解决方案--------------------
创建了一个class类型的变量(数据成员),岂不比调用方法要更强依赖?
你还是找个《Exceptional C++》看看item 26~30吧。
你对“依赖”的理解还不正确。
------解决方案--------------------
-------------------------------------------------
Date birthDate_;
Address address_;
Country citizenship_;
-------------------------------------------------
上面这样的时候只有类声明是不行的,这样你就必须include头文件了,只有类声明的时候编译器是无法知道这些对象大小,就没办法去构造Person类的对象了,换成指针就可以
-------------------------------------------------
Date * birthDate_;
Address * address_;
Country * citizenship_;
-------------------------------------------------
------解决方案--------------------
飘过
给点分
------解决方案--------------------
c/c++的头文件是彻头彻尾的垃圾,应该学学别的语言所采取的解决方案