关于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++的头文件是彻头彻尾的垃圾,应该学学别的语言所采取的解决方案
尽量以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++的头文件是彻头彻尾的垃圾,应该学学别的语言所采取的解决方案