【CPP】一個CPP的Library(libXXXcore)和測試程序XXX_main的Demo

一個CPP的Library和測試程序Demo

  • 1. 思路描述
    • 目錄結構
    • 總控CMakeList.txt文件
  • 2. Library代碼實現
    • 2.1 XXXLib.hpp文件(對外的接口定義文件)和XXXLib.cpp文件
      • 2.1.1 XXXLib.hpp文件
      • 2.1.2 XXXLib.cpp文件
    • 2.2 CXXXLibApi.hpp文件和CXXXLibApi.cpp文件(內部的API基類)
      • 2.2.1 CXXXLibApi.hpp文件
      • 2.2.2 CXXXLibApi.cpp文件
    • 2.3 CXXXService.hpp和CXXXService.cpp文件(具體的業務類)
      • 2.3.1 CXXXService.hpp文件
      • 2.3.2 CXXXService.cpp文件
    • 2.4 CMakeLists.txt
  • 3. XXX_main測試程序代碼實現
    • 3.1 main.cpp文件
    • 3.2 XXX_main的CMakeLists.txt文件
  • 4. 編譯過程
  • 5. 執行過程
  • 6. UML圖分析
    • 6.1 類圖
    • 6.2 序列圖
  • 7. 遺留問題


1. 思路描述

實現一個簡單的library 和 測試主程序Demo。

  • Library內容包括:
  1. class分層的Library源碼。
  2. 定義API類,提供給外部調用程序操作library的入口。
  3. 定義Callback類,提供給外部程序library有哪些返回信息。
  4. 一個LibManager,用于關聯API類和Callback類。
  5. 一個CMakeLists.txt,用于編譯生成libXXXCore庫。
  • XXX_main測試程序:
  1. 一個Main程序,展示如何使用Library庫。
  2. 一個CMakeLists.txt, 用于編譯生成可執行文件XXX_main。

由于筆者在Windows 11系統, JetBrains CLion開發該Demo,因此,生成的library和可執行文件是libXXXCore.dll和XXX_main.exe文件。

此處主要是想分享一種Class分層設計的思想,供交流學習。

同樣,可以將源代碼移植到Linux平臺上,編譯成libXXXCore.so庫和XXX_main可執行文件。


目錄結構

C:.
│  CMakeLists.txt
└─soDemo├─main│      CMakeLists.txt│      main.cpp│└─XXXCore│  CMakeLists.txt│├─include│      XXXLib.hpp└─srcCXXXLibApi.cppCXXXLibApi.hppCXXXService.cppCXXXService.hppXXXLib.cppPS C:\Users\84029\CLionProjects\hello0614>

總控CMakeList.txt文件

cmake_minimum_required(VERSION 3.15)
project(hello)
set(CMAKE_CXX_STANDARD 11)
add_subdirectory(soDemo/XXXCore)
add_subdirectory(soDemo/main)

2. Library代碼實現

2.1 XXXLib.hpp文件(對外的接口定義文件)和XXXLib.cpp文件

2.1.1 XXXLib.hpp文件

#ifndef __XXXLIB_HPP__
#define __XXXLIB_HPP__#include <stdint.h>
#include <stdlib.h>
#include <vector>
#include <thread>
#include <mutex>class IXXXLibApi;
class IXXXLibCallback;#define S_LIB_OK               (0)
#define E_LIB_FAILED           (-1)
#define E_LIB_TIMEOUT          (1)class XXXLibManager
{
public:static IXXXLibApi* getXXXLibApi(IXXXLibCallback* XXXLibCb);
};class IXXXLibApi
{
public:virtual int32_t init() = 0;virtual int32_t play(uint8_t id) = 0;virtual int32_t stop(void) = 0;virtual int32_t scan(void) = 0;
private:
};class IXXXLibCallback
{
public:virtual void notifySignalStrength(int8_t signalStrength) = 0;
};#endif

注意事項:

  1. XXXLib.hpp文件是定義的對外的接口文件,定義了API虛基類和Callback虛基類。調用者的程序需要include該頭文件。

2.1.2 XXXLib.cpp文件

#include "../include/XXXLib.hpp"
#include "CXXXLibApi.hpp"IXXXLibApi* XXXLibManager::getXXXLibApi(IXXXLibCallback* XXXLibCb)
{printf("XXXLibManager::getXXXLibApi()\n");return CXXXLibApi::getInstance(XXXLibCb);
}

2.2 CXXXLibApi.hpp文件和CXXXLibApi.cpp文件(內部的API基類)

2.2.1 CXXXLibApi.hpp文件

#ifndef CXXXLIBAPI_HPP
#define CXXXLIBAPI_HPP#include <stdint.h>
#include <stdlib.h>
#include <thread>
#include "../include/XXXLib.hpp"
#include "CXXXService.hpp"
using namespace std;class CXXXLibApi : public IXXXLibApi
{
public:static IXXXLibApi* getInstance(IXXXLibCallback* cb);virtual int32_t init();virtual int32_t play(uint8_t id);virtual int32_t stop(void);virtual int32_t scan(void);private:CXXXLibApi(IXXXLibCallback* cb);virtual ~CXXXLibApi();private:static IXXXLibApi* mpApi;IXXXLibCallback* mpCb;CXXXService *mpXXXService;
};#endif

2.2.2 CXXXLibApi.cpp文件

#include "../include/XXXLib.hpp"
#include "CXXXLibApi.hpp"IXXXLibApi *CXXXLibApi::mpApi = NULL;CXXXLibApi::CXXXLibApi(IXXXLibCallback *cb) : mpCb(cb)
{mpXXXService = CXXXService::getInstance();
}CXXXLibApi::~CXXXLibApi()
{
}IXXXLibApi *CXXXLibApi::getInstance(IXXXLibCallback *cb)
{if (NULL == mpApi){printf(

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/93958.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/93958.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/93958.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【YashanDB認證】學習YashanDB的探索之路:從入門到實踐

在國產數據庫蓬勃發展的浪潮中&#xff0c;選擇了YashanDB作為技術學習的切入點。這不僅讓我深入了解了數據庫的核心技術&#xff0c;也讓我深刻體會到國產數據庫在性能、可靠性和生態適配上的創新價值。以下是我在學習YashanDB過程中的經驗與感悟。 一、YashanDB基礎介紹 Ya…

element UI 和 element plus 在組件上有哪些不同

Element UI 和 Element Plus 都是基于 Vue 的桌面端 UI 組件庫&#xff0c;由同一團隊&#xff08;餓了么前端團隊&#xff09;開發和維護。Element Plus 是 Element UI 的升級版&#xff0c;專為 Vue 3 設計&#xff0c;而 Element UI 僅支持 Vue 2。以下是它們在組件層面的主…

【3D重建技術】如何基于遙感圖像和DEM等數據進行城市級高精度三維重建?

城市級高精度三維重建是融合多源空間數據&#xff08;遙感圖像、DEM、GIS矢量等&#xff09;、計算機視覺與地理信息處理技術的復雜過程&#xff0c;核心目標是構建包含“地形地物&#xff08;建筑、道路、植被等&#xff09;”的真實、高精度三維場景。其流程可分為數據準備、…

【unitrix數間混合計算】3.4 無符號小數部分標記trait(bin_unsigned.rs)

一、源碼 這段代碼定義了一個類型級二進制小數系統&#xff0c;用于在編譯時表示和驗證二進制小數部分的有效性。 use crate::number::{F0, BFrac, Bit};/// 標記合法的二進制小數部分類型 pub trait BinFrac: Copy Default static {}// 空小數部分&#xff08;表示值為0&…

從一次 DDoS 的“死亡回放”看現代攻擊鏈的進化

本文記錄的是作者上周在測試環境真實踩到的坑。為了讓讀者能復現并親手體驗防御思路&#xff0c;文末給出了一份最小可運行的 Go 腳本&#xff0c;支持本地壓測 日志回放&#xff0c;方便對比加防護前后的差異。攻擊現場還原 周一凌晨 2:14&#xff0c;監控群里突然彈出告警&a…

LeetCode熱題100--101. 對稱二叉樹--簡單

1. 題目 給你一個二叉樹的根節點 root &#xff0c; 檢查它是否軸對稱。 示例 1&#xff1a;輸入&#xff1a;root [1,2,2,3,4,4,3] 輸出&#xff1a;true 示例 2&#xff1a;輸入&#xff1a;root [1,2,2,null,3,null,3] 輸出&#xff1a;false 2. 題解 /*** Definition for…

Pub/Sub是什么意思

Pub/Sub&#xff08;發布/訂閱模式&#xff09;?? 是一種異步消息通信范式&#xff0c;用于分布式系統中不同組件之間的解耦通信。它的核心思想是將消息的發送方&#xff08;發布者&#xff09;?? 和接收方&#xff08;訂閱者&#xff09;?? 分離&#xff0c;通過一個中間…

Redisson3.14.1及之后連接阿里云redis代理模式,使用分布式鎖:ERR unknown command ‘WAIT‘

文章目錄一、問題背景1、問題原因2、阿里云對Redisson的支持二、解決方案1、繼續使用Redisson3.14.0版本2、阿里云redis改為直連模式3、升級Redisson版本到 3.47.0一、問題背景 1、問題原因 阿里云Redis分直連和代理模式&#xff0c;其中代理模式是不支持WAIT命令的。 目前嘗…

Linux: RAID(磁盤冗余陣列)配置全指南

Linux&#xff1a;RAID&#xff08;磁盤冗余陣列&#xff09;配置一、RAID 核心概念 RAID&#xff08;Redundant Array of Independent Disks&#xff0c;磁盤冗余陣列&#xff09;通過將多個物理磁盤組合為一個邏輯存儲設備&#xff0c;實現提升讀寫性能、增強數據安全性或平衡…

《GPT-OSS 模型全解析:OpenAI 回歸開源的 Mixture-of-Experts 之路》

目錄 一、引言 二、GPT-OSS 模型簡介 1. 版本與定位 2. 架構設計與技術亮點 2.1 Mixture-of-Experts&#xff08;MoE&#xff09;架構 2.2 高效推理機制與優化技術 2.3 模型對比 三、模型部署 1. 安裝相關依賴 1.1 uv 安裝 1.2 conda 安裝 1.3 Transformers 運行 g…

【力扣熱題100】雙指針—— 接雨水

題目 給定 n 個非負整數表示每個寬度為 1 的柱子的高度圖&#xff0c;計算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 注意&#xff1a;答案中不可以包含重復的三元組。輸入&#xff1a;height [0,1,0,2,1,0,1,3,2,1,2,1] 輸出&#xff1a;6 解釋&#xff1a;上面是由…

51單片機拼接板(開發板積木)

一、前言 1.1 背景 讀書那會兒&#xff08;2013年左右&#xff09;網上接了很多51單片機的設計。 當時有個痛點: 每張板子都是定制的&#xff0c;畫板子&#xff0c;打樣&#xff0c;寫代碼需要花費很多時間。 希望有一張板子&#xff0c;能夠實現絕大多數單片機的功能&#xf…

使用segment-anything將目標檢測label轉換為語義分割label

使用segment-anything將目標檢測label轉換為語義分割label一、segment-anything簡介二、segment-anything安裝2.1安裝方法2.2預訓練模型下載三、將目標檢測label轉換為語義分割label3.1示例代碼3.2代碼說明一、segment-anything簡介 segment-anything是facebookresearch團隊開…

【unitrix數間混合計算】3.3 無符號整數標記trait(bin_unsigned.rs)

一、源碼 這段代碼是用 Rust 語言實現的一個類型級無符號二進制整數系統&#xff0c;通過類型系統在編譯時表示和操作二進制數字。這是一種典型的"類型級編程"&#xff08;type-level programming&#xff09;技術。 use crate::number::{U0, Bin, Bit, BinInt};/// …

Python基本語法總結

1.類&#xff08;Class&#xff09;在Python中類&#xff08;Class&#xff09;是面向對象編程&#xff08;OOP&#xff09;的核心概念。1.1.類的基本定義最簡單的類class Cat:"""這是一個最簡單的類"""pass #創建實例 obj Cat()包含方法的類cl…

數據結構05(Java)-- ( 歸并排序實質,歸并排序擴展問題:小和問題)

前言 本文為本小白&#x1f92f;學習數據結構的筆記&#xff0c;將以算法題為導向&#xff0c;向大家更清晰的介紹數據結構相關知識&#xff08;算法題都出自&#x1f64c;B站馬士兵教育——左老師的課程&#xff0c;講的很好&#xff0c;對于想入門刷題的人很有幫助&#x1f4…

稅務專業人員能力構建與發展路徑指南

CDA數據分析師證書含金量高&#xff0c;適應了未來數字化經濟和AI發展趨勢&#xff0c;難度不高&#xff0c;行業認可度高&#xff0c;對于找工作很有幫助。一、稅務專業人員的核心能力框架能力維度關鍵技能要素專業工具與方法論實踐輸出成果稅務法規應用稅種政策解讀、法規更新…

Linux中rsync使用與inotify實時同步配置指南

Linux中rsync使用與inotify實時同步配置指南 一、rsync 簡介 rsync&#xff08;Remote Sync&#xff09;是 Linux 系統下的一款高效數據鏡像和備份工具&#xff0c;用于在本地或遠程同步文件和目錄。 支持本地復制、基于 SSH 的遠程同步&#xff0c;以及使用自有 rsync 協議的同…

Unicode 字符串轉 UTF-8 編碼算法剖析

&#x1f4ca; Unicode 字符串轉 UTF-8 編碼算法剖析 ——從 C# char 到 C wchar_t 的編碼轉換原理 引用&#xff1a;UTF-8 編解碼可視化分析 &#x1f50d; 1. 算法功能概述 該函數將 Unicode 字符串&#xff08;C# string&#xff09;轉換為 UTF-8 編碼的字節數組&#xf…

php的安全性到底怎么樣

PHP作為一種流行的服務器端腳本語言&#xff0c;被廣泛應用于Web開發。然而&#xff0c;由于PHP是一種較為靈活的語言&#xff0c;其安全性議題一直備受爭議。在這篇文章中&#xff0c;我將從多個方面來討論PHP的安全性&#xff0c;包括常見的安全漏洞、防范措施以及最佳實踐。…