zoukankan      html  css  js  c++  java
  • 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等的实现细节)
  • 相关阅读:
    QtDBus快速入门
    论Qt容器与STL
    JS中的!=、== 、!==、===的用法和区别
    JS操作JSON总结
    select2使用方法总结
    Entity Framework插入数据报错:Validation failed for one or more entities. See 'EntityValidationErrors' property for more details.
    Windows登录类型及安全日志解析
    <script type="text/html"></script> js模版使用
    在 C# 中,(int) ,Int32.Parse() 和 Convert.toInt32() 三种方法的区别
    关于session,cookie,Cache
  • 原文地址:https://www.cnblogs.com/kkshaq/p/4462524.html
Copyright © 2011-2022 走看看