• 将文件间的编译依赖关系(Compilation dependency)降至最低


    //如果如下头文件中有任何一个改变,或者这些头文件所依赖的其他头文件有任何改变,那么每一个#include "Person.h"就得重新编译,任何使用Person Class的文件也必须重新编译。

    ==handle class
    #include
    #include “date.h”
    #include “address.h”
    [Person.h更改前]
    Person {
    public:
    Person(const std::string& name, const Date& birthday, const Address& addr);
    std::string name() const;
    std::string birthday() const;
    std::string address() const;
    private:
    std::string theName;
    Date theBirthDate;
    Address theAddress;
    };

    [Person.h更改后] 这样更改后#include "Person.h"的文件,不会因为PersonImpl, Date, Address的改变而重新编译,因为客户include "Person.h"文件中没有关于PersonImpl, Date, Address它们的定义式include “PersonImpl.h”,而是用了类的声明式class PersonImpl;
    #include
    class PersonImpl; //类的声明式
    class Date;
    class Address;

    class Person {
    public:
    Person(const std::string& name, const Date& birthday, const Address& addr);
    std::string name() const;
    std::string birthdayDate() const;
    std::string address() const;
    private:
    std::tr1:shared_ptr pImpl;
    };

    [Person.cpp]
    #include “Person.h”
    #include “PersonImpl.h”

    Person::Person(const std::string& name, const Date& birthday, const Address& addr)
    pImpl(new PersonImpl(name, birthday, addr))
    ()
    std::string Person::name() const
    {
    return pImpl->name();
    }

    interface class=
    class Person {
    public:
    virtual ~Person();
    virtual std::string name() const=0;
    virtual std::string birthDate() const=0;
    virtual std::string address() const=0;
    static std::tr1::shared_ptr create(const std::string& name, const Date& birthday, const Address& addr);
    };

    客户会这样使用它们:
    std::string name;
    Date dateOfBirth;
    Address address;
    std::tr1::shared_ptr pp(Person::create(name, address, address));
    std::out << pp->name()
    << “was born on "
    << pp->birthDate()
    << " and now lives at”
    << pp->adress();

    class RealPerson : public Person {
    public:
    RealPerson(const std::string& name, const Date& birthday, const Address& addr)
    : theName(name), theBirthDate(birthday), theAddress(addr)
    ()
    virtual ~RealPerson() {}
    std::string name() const;
    std::string birthdayDate() const;
    std::string address() const;
    private:
    std::string theName;
    Date theBirthDate;
    Address theAddress;
    };

    std::tr1::shared_ptr Person::create(const std::string& name, const Date& birthday, const Address& addr);
    {
    return std::tr1::shared_ptr(new RealPerson(name, birthday, addr));
    }

    支持“编译依存性最小化”的一般构想是:相依于声明式,不要相依于定义式。
    程序库头文件应该以“完全且仅有声明式”的形式存在。

  • 相关阅读:
    Docker面试整理-Docker Swarm与Kubernetes有什么区别?
    对JVM G1的理解
    win搜索文件搜不到含有括号的的图片,例如(2).png 搜索不到括号,解决,System.FileName:~=“(”
    Jenkins+Allure+Pytest的持续集成
    Retentive Network: A Successor to Transformer for Large Language Models
    温故知新(十)——UART
    【自然语言处理(NLP)】基于Word2Vec的语言模型实践
    lvresize与lvextend扩容逻辑卷的区别
    宠物之家网站大学生网页制作教程 学生HTML静态宠物网页设计作业成品 DIV布局简单动物网页制作代码
    win10任务栏卡死桌面正常的解决方法
  • 原文地址:https://blog.csdn.net/winneyDD/article/details/126007812