一、PIMPL模式引入
PIMPL是指pointer to implementation,又称作“编译防火墙”。它通过将类B放置在单独的类A中,使用B的不透明指针进行访问实现,从而隐藏了A类的实现细节。是实现“将文件间的编译依存关系降至最低”的方法之一。
实例:
常规实现book类
book.h
#pragma once
#include <iostream>
class book
{
public:
book(std::string name,double price);
~book();
void display();
void set_price(double price);
private:
std::string book_name;
double book_price;
};
book.cpp
#include "book.h"
book::book(std::string name, double price) :book_name(name), book_price(price)
{
}
book::~book()
{
}
void
book::display()
{
std::cout << "book name:" << book_name << std::endl;
std::cout << "book price:" << book_price << std::endl;
}
void
book::set_price(double price)
{
book_price = price;
}
main.cpp
#include "book.h"
int main()
{
book b("Grimm's Fairy Tales",49.9);
b.display();
b.set_price(45.9);
b.display();
}
常规实现的缺点:
①头文件暴露了私有成员
②接口和实现耦合,存在严重编译依赖性(当另一个库使用了这个库,而book库实现变了,头文件就会变,而头文件一旦变动,所有使用了这个库的程序都要重新编译,这会花费很多编译时间。)
PIMPL模式实现
book.h
#pragma once
#include <iostream>
class impl;
class book
{
public:
book();
book(std::string , double );
~book();
/*私有成员为指针,禁止使用C++默认浅拷贝*/
book(const book&) = delete;
b