--------屏蔽一个class的技术 pimpl
class COMMONFUN_EXPORT Book
{
public:
Book();
~Book();
void print();
private:
class BookImpl;
BookImpl* pimpl;
};
class Book::BookImpl
{
public:
void print();
private:
std::string content_;
std::string titil_;
};
.cpp文件实现
Book::Book()
{
pimpl = new BookImpl();
}
Book::~Book()
{
delete pimpl;
}
void Book::print()
{
pimpl->print();
}
void Book::BookImpl::print()
{
std::cout << "print in imple" << std::endl;
}
可以隔离impl内部的头文件引入以及实现细节,导出book类即可
--------中间层隔离底层thirds
现在很多库 head only有很多导出namespace
***
参考:
https://www.zhihu.com/question/35461702
***
公共组件需要中间包装一层以免在更换third后 业务代码处处修改
json和xml举例
//##########################JSON系列接口
#include "json.hpp"
namespace inonlohmann {
using namespace nlohmann;
};
//##########################JSON列接口
//##########################XML列接口
#include "rapidxml.hpp"
#include "rapidxml_print.hpp"
#include "rapidxml_utils.hpp"
#include "rapidxml_iterators.hpp"
namespace inoxml {
using namespace rapidxml;
};
//##########################XML列接口
-------公共组件的引入第三方库头文件太多,怎么办
1、统一放在一起一个头文件全部加入,类似asio.hpp,即:single-header模式
#include "asio/associated_allocator.hpp"
#include "asio/associated_executor.hpp"
#include "asio/associated_cancellation_slot.hpp"
#include "asio/associator.hpp"
#include "asio/async_result.hpp"
#include "asio/awaitable.hpp"
#include "asio/basic_datagram_socket.hpp"
#include "asio/basic_deadline_timer.hpp"
#include "asio/basic_io_object.hpp"
#include "asio/basic_raw_socket.hpp"
#include "asio/basic_seq_packet_socket.hpp"
2、所有业务统一include path 和linkpath 在更高级别目录统一设置,用什么third文件引入什么
这种做法实际并没有从代码层面实现 公共层/中间层 对于业务和thirds的高度隔离
3、防止头文件被多次重复引用的做法
宏定义
#ifndef _NAME_H
#define _NAME_H
//头文件内容
#endif
#pragma once避免重复引入
_Pragma("once")