公共库开发设计技巧

原创
2021/10/27 16:11
阅读数 65
AI总结

 

--------屏蔽一个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")
 

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
0 评论
0 收藏
0
分享
AI总结
返回顶部
顶部