zoukankan      html  css  js  c++  java
  • 1.将文件间的编译依存关系降至最低

    问题描述:

    Person.h

    #include <string>

    #include "Date.h"

    class Person
    {
    public:
     Person(const std::string& name,const Date& birthday);
     std::string name() const;
     std::string birthDate() const;
     std::string address() const;
    private:
     ...
    };

    Person.cpp

    #include "Person.h"

    Person::Person(const std::string& name,const Date& birthday)

    {

    }

    Date.h

    class Date
    {
    public:
     Date(int year,int month,int day);
     ~Date(void);
    };

    Person.h中包含了Date.h,如果Date.h被改变,那么不仅Date.cpp、Person.cpp也会被编译。

    解决办法:用“声明依存性”代替“定义依存性”。

    将Person.h作如下修改:

    class Date;

    class Person

    {

    public:  

    Person(const std::string& name,const Date& birthday);  

    std::string name() const;  

    std::string birthDate() const;  

    std::string address() const; 

    };

     说明:

    由于编译器必须在编译期间知道对象的大小,所以使用声明式时,无法使用该类的对象。

    注意:当你声明一个函数而它用到某个class时,你并不需要该class的定义:纵使函数以by value方式传递类型的参数(或返回值)亦然

    例如:

    class Date;                   //class声明式

    Date today()                  //正确,虽然返回值是Date的定义式

    void clearAppointments(Date d);  // Date的定义式

    两种设计思路

    1. Handle class方式

    Person.h

    class PersonImpl;

    class Date;

    class Person

    {

    public: 

    Person(const std::string& name,const Date& birthday); 

    std::string name() const; 

    std::string birthDate() const; 

    std::string address() const;

    private:

      std::tr1::shared_ptr<PersonImpl> pImpl;

    };

    Person.cpp

    #include "Person.h"    //我们正在实现Person class,

                        //所以必须#include 其定义式

    #include "PersonImpl.h"

    Person::Person(const std::string& name,const Date& birthday) :

          pImpl(new PersionImpl(name,birthday))

    {}

    std::string Person::name() const

    {

      return pImpl->name();

    }

    2. Interface class

    class Person{

    public:

      static std::tr1::shared_ptr<Person> create(const std::string& name,

              const Date& birthday);

      virtual ~Person();

      virtual std::string name() const = 0;

      virtual std::string birthDate() const = 0;

      virtual std::string address() const = 0;

        ...

    };

    实现类

    class RealPerson: public Person{

    public:

      RealPerson(const std::string& name,const Date& birthday) :

        theName(name),theBirthDate(birthday){}

       virtual ~RealPerson() {}

      std::string name() const;

      std:: string birthDate() const;

    private:

      std::string theName;

      Date theBirthDate;

    };

    Person.cpp

    std::tr1::shared_ptr<Person> Person::create(const std::string& name,

                                        const Date& birthday)

    {

      return std::tr1::shared_ptr<Person>(new RealPerson(name,birthday));

    }

  • 相关阅读:
    java keytool证书工具使用小结(转)
    Https socket 代理
    SSL连接出现的问题
    Https 代理 sslsocket
    Https socket 连接
    linux系统一键安装phpstudy的lnmp环境
    Yii2框架实现计数器功能
    yii2框架增删改查案例
    yii2框架原生的结合框架使用的图片上传
    php将抓取的图片链接下载到本地
  • 原文地址:https://www.cnblogs.com/elitiwin/p/4023797.html
Copyright © 2011-2022 走看看