c++将文件之间编译关系降到最低
2015-04-28 11:29
281 查看
类的定义式:类的定义,可以知道类的大小
类的实现:
类的声明:类的声明,表明,使用此类,编译不会出错
C++并没有把“将接口从实现中分离”做得很好。Class的定义式不只详细叙述了Class接口,还包括十足的实现序幕。如:
class Person
{
public:
Person(const string& name,const Dateg& birthday,const Address& addr);
string name() const;
string birthDate() const;
string address() const;
....
private:
string theName;
Date thebirthDate;
Address theAddress;
};
这里的Person无法通过编译,因为编译器没看到string,Date和Address的定义式。这样的定义式通常由#include指示符提供,所以Person定义文件的最上方很可能存在这样的东西:
#include <string>
#include “date.h”
#include “address.h”
但是,这么一来便是在Person定义文件和其含入文件之间形成了一种编译依存关系。如果这些头文件中的一个被改变,或这些头文件所依赖的其他头文件有任何改变,那么每一个含入Person class的文件就得重新编译,任何使用Person class的文件也必须重新编译。这通常会对大项目造成灾难。
解决方法:
考虑加上前置声明,以去掉#include包含的头文件:
class Date;//前置声明
class Address;//前置声明
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: //可有可无,随便写不写
string theName;
Date thebirthDate;
Address theAddress;
};
通过此方法,可以消除耦合,class person与class Date等没有依赖关系,Person的客户就只有在Person接口被修改时才重新编译。
但是这个方法有个问题:
类的实现:
类的声明:类的声明,表明,使用此类,编译不会出错
C++并没有把“将接口从实现中分离”做得很好。Class的定义式不只详细叙述了Class接口,还包括十足的实现序幕。如:
class Person
{
public:
Person(const string& name,const Dateg& birthday,const Address& addr);
string name() const;
string birthDate() const;
string address() const;
....
private:
string theName;
Date thebirthDate;
Address theAddress;
};
这里的Person无法通过编译,因为编译器没看到string,Date和Address的定义式。这样的定义式通常由#include指示符提供,所以Person定义文件的最上方很可能存在这样的东西:
#include <string>
#include “date.h”
#include “address.h”
但是,这么一来便是在Person定义文件和其含入文件之间形成了一种编译依存关系。如果这些头文件中的一个被改变,或这些头文件所依赖的其他头文件有任何改变,那么每一个含入Person class的文件就得重新编译,任何使用Person class的文件也必须重新编译。这通常会对大项目造成灾难。
解决方法:
考虑加上前置声明,以去掉#include包含的头文件:
class Date;//前置声明
class Address;//前置声明
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: //可有可无,随便写不写
string theName;
Date thebirthDate;
Address theAddress;
};
通过此方法,可以消除耦合,class person与class Date等没有依赖关系,Person的客户就只有在Person接口被修改时才重新编译。
但是这个方法有个问题:
int main() { int x; Person p(params); } 当编译器看到x的定义式,它知道必须分配多少内存才能够容下一个int。但当编议器看到p的定义式,如何知道一个person有多大?唯一的办法就是询问class的定义式,然而如果class定义式不列出实现的细节(不知道到class Date等的实现细节)
相关文章推荐
- 读书笔记_Effective_C++_条款三十一:将文件间的编译依存关系降至最低(第一部分)
- 读书笔记 effective c++ Item 31 把文件之间的编译依赖降到最低
- 读书笔记_Effective_C++_条款三十一:将文件间的编译依存关系降至最低(第二部分)
- effective C++ 条款 31:将文件间的编译依存关系降至最低
- 读书笔记_Effective_C++_条款三十一:将文件间的编译依存关系降至最低(第三部分)
- 小心得:处理两个头文件互调,死循环情况(将文件之间的编译依赖关系降至最低)
- 读书笔记_Effective_C++_条款三十一:将文件间的编译依存关系降至最低
- 将文件之间的编译依赖关系降至最低
- C++ 将文件间的编译依存关系降到最低
- C++ 接口与实现分离技术---如何将文件间的编译关系降至最低
- 条款31:将文件间的编译依存关系降至最低
- 将文件间的编译依存关系降至最低(第二部分)
- 条款31:将文件间的编译依存关系降至最低
- Effective C++ -----条款31:将文件间的编译依存关系降至最低
- 条款31:将文件间的编译依存关系降至最低
- 将文件间的编译依存关系将至最低
- Effective c++之 将文件间的编译依存关系降至最低
- Effective C++ 条款31 将文件中间的编译依存关系降至最低
- Effective C++笔记_条款31将文件间的编译依存关系降至最低
- 条款34: 将文件间的编译依赖性降至最低 (转自effective c++ second edition)