自足,如果不能,就依赖其它文件中的声明,而不是定义。其它每一件事都从这个简单的设计策略产生。所以:
当对象的引用和指针可以做到时就避免使用对象。仅需一个类型的声明,你就可以定义到这个类型的引用或指针。而定义一个类型的对象必须要存在这个类型的定义。
只要你能做到,就用对类声明的依赖替代对类定义的依赖。注意你声明一个使用一个类的函数时绝对不需要有这个类的定义,即使这个函数通过传值方式传递或返回这个类:
class Date; // class declaration Date today(); // fine - no definition void clearAppointments(Date d); // of Date is needed 当然,传值通常不是一个好主意,但是如果你发现你自己因为某种原因而使用它,依然不能为引入不必要的编译依赖辩解。
不声明 Date 就可以声明 today 和 clearAppointments 的能力可能会令你感到惊奇,但是它其实并不像看上去那么不同寻常。如果有人调用这些函数,则 Date 的定义必须在调用之前被看到。为什么费心去声明没有人调用的函数,你想知道吗?很简单。并不是没有人调用它们,而是并非每个人都要调用它们。如果你有一个包含很多函数声明的库,每一个客户都要调用每一个函数是不太可能的。通过将提供类定义的责任从你的声明函数的头文件转移到客户的包含函数调用的文件,你就消除了客户对他们并不真的需要的类型的依赖。
|