• 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等的实现细节)
  • 相关阅读:
    getWritableDatabase()与getReadableDatabase()方法
    使用drawBitmapMesh扭曲图像
    移动游戏背景
    使用Matrix控制图片和组件的变化
    使用Matrix控制图像或组件变换的步骤
    1105: 零起点学算法12——求2个日期之间的天数
    1104: 零起点学算法11——求梯形面积
    1103: 零起点学算法10——求圆柱体的表面积
    1102: 零起点学算法09——继续练习简单的输入和计算(a-b)
    1101: 零起点学算法08——简单的输入和计算(a+b)
  • 原文地址:https://www.cnblogs.com/kkshaq/p/4462524.html
Copyright © 2020-2023  润新知