C++开发中,如果不注意,随便修改一个头文件中的定义,会导致很多引用(indlude)到该头文件的文件重新编译,觉得很浪费时间,所以要尽量减少文件之间的编译依赖。
除了标准库,尽量不要在头文件中直接包含要使用的类的头文件,虽然直接包含头文件对于客户端程序员有方便之处(包含了你的头文件就可以直接使用依赖的东西),但对于大项目,会耗费大量的编译时间,不可取。
使用预先声明(forward declaration)的难点是必须让编译器在编译期间知道它的对象的大小,如果在你的头文件中定义的类成员变量是一个自定义类,最好使用指针来隐藏类细节,这样编译器知道指针的大小。
class Addr; //forward declaration instead of directly include "Addr.h"
class Customer
{
public:
Customer();
private:
Addr* myAddr; //use pointer instead of directly Addr
Date* myLastModified;
};
使用接口(Interface)和工厂方法(factory)是一个较好的方式。就是你只依赖接口头文件,对于具体的实现类,你无须注意。
更详细的论述见: http://develop.csai.cn/c/200604060902171527.htm
除了标准库,尽量不要在头文件中直接包含要使用的类的头文件,虽然直接包含头文件对于客户端程序员有方便之处(包含了你的头文件就可以直接使用依赖的东西),但对于大项目,会耗费大量的编译时间,不可取。
使用预先声明(forward declaration)的难点是必须让编译器在编译期间知道它的对象的大小,如果在你的头文件中定义的类成员变量是一个自定义类,最好使用指针来隐藏类细节,这样编译器知道指针的大小。
class Addr; //forward declaration instead of directly include "Addr.h"
class Customer
{
public:
Customer();
private:
Addr* myAddr; //use pointer instead of directly Addr
Date* myLastModified;
};
用对类声明的依赖替代对类定义的依赖是减少编译依赖的原则。你声明一个使用一个类的函数时绝对不需要有这个类的定义,即使这个函数通过传值方式传递或返回这个类。
class Date; // class declaration
Date today(); // fine - no definition
void setLastModified(Date d); //fine
使用接口(Interface)和工厂方法(factory)是一个较好的方式。就是你只依赖接口头文件,对于具体的实现类,你无须注意。
更详细的论述见: http://develop.csai.cn/c/200604060902171527.htm