问题背景
有时候会发现仅仅改动了某个类的一点实现(仅仅是几句代码),在编译时却发现要编译整个工程!特别是工程有点大时,编译要等很久很久。。。只为修改一个问题,时间都浪费在等待上了。为了避免这一问题,其实是可以通过巧妙的设计来避开文件间的依赖。
形成依赖的主要缘由:
头文件依赖,A类依赖B类,B类依赖C类,结果只改动C类的任何一个数据成员,A,B都得重编译。C++在编译期间,编译器需要知道对象的大小(才能够分配足够的内存空间),这就导致了上面的互相依赖的编译。
解决办法:
1.把类的实现细节隐藏在一个指针背后(指针的大小显然是已知的),指针指向实现细节的类,这样修改细节时不会引发大面积的依赖编译。
2.使用抽象基类。
解决方案一:指针背后的游戏
假设我们要实现一个Person的类
类的定义如下:
//Person.h文件
#pragma once
#include <iostream>
#include <string>
#include <memory>
//实现细节类的前置声明 注意:并没有用include引入该类的定义式,而是巧妙的用声明式替换它,这样头文件Preson对实现细节没有任何的依赖!
class PresonPri;
class Person
{
public:
Person();
~Person();
std::string adder()const;
std::string name()const;
std::string date()const;
private:
//这里使用智能指针,该指针用来指向类的实现细节
std::tr1::shared_ptr<PresonPri> pImpl;
};
在Person类的实现部分调用 他的细节类PresonPri来实现。
类的实现部分:
//Person.cpp 文件
#include "Person.h"
#include "PresonPri.h"
Person::Person()
:pImpl(new PresonPri())
{
}
Person::~Person()
{
}
std::string Person::adder() const
{
return pImpl->_adder();
}
std::string