一個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內容包括:
- class分層的Library源碼。
- 定義API類,提供給外部調用程序操作library的入口。
- 定義Callback類,提供給外部程序library有哪些返回信息。
- 一個LibManager,用于關聯API類和Callback類。
- 一個CMakeLists.txt,用于編譯生成libXXXCore庫。
- XXX_main測試程序:
- 一個Main程序,展示如何使用Library庫。
- 一個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
注意事項:
- 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(