C++进阶 降低文件间的编译依存关系(接口与实现解耦合)

本文探讨了如何降低C++文件间的编译依赖关系,主要介绍了两种解决方案:一是利用指针隐藏类的实现细节,二是通过抽象类定义接口。通过这两种方法,可以有效减少因修改代码而导致的大量编译工作,提高开发效率。
摘要由CSDN通过智能技术生成

问题背景

有时候会发现仅仅改动了某个类的一点实现(仅仅是几句代码),在编译时却发现要编译整个工程!特别是工程有点大时,编译要等很久很久。。。只为修改一个问题,时间都浪费在等待上了。为了避免这一问题,其实是可以通过巧妙的设计来避开文件间的依赖。


形成依赖的主要缘由:
头文件依赖,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
  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值