c++将文件之间编译关系降到最低

时间:2023-03-10 06:48:22
c++将文件之间编译关系降到最低

类的定义式:类的定义,可以知道类的大小

类的实现:

类的声明:类的声明,表明,使用此类,编译不会出错

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等的实现细节)