C++ 类导出及其显式调用
1. 概述
本文介绍一种利用C++面向对象的继承特性与多态特性对类进行导出为动态链接库DLL
及显式调用,该种导出方法可以减少在调用时对头文件的依赖,更好地隐藏信息。本文由两部分组成,即类的导出和DLL
的显式调用,以算法类ALG
的封装及调用进行讲解说明。
2. C++
类的导出
C++
类的导出由三部分组成,即父类ALG
的申明、子类ScratchDetectALG
的声明及实现、子类ScratchDetectALG
的导出
2.1 父类ALG
的申明
根据实际接口需求,申明ALG
的公有函数。
// ALG.h
#pragma once
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
class ALG
{
public:
virtual bool inital(const string& enginePath) = 0;
virtual void detect(const Mat& inputImg, vector<Rect>& vRect)=0;
};
2.2 子类ScratchDetectALG
的声明及实现
子类ScratchDetectALG
继承父类ALG
,然后进行实现。
ScratchDetectALG
的声明
// ScratchDetectALG.h
#include <iostream>
#include <opencv2/opencv.hpp>
#include "ALG.h"
class ScratchDetectALG:public ALG
{
public:
ScratchDetectALG();
~ScratchDetectALG();
bool inital(const string& enginePath);
void detect(const Mat& inputImg, vector<Rect>& vRect);
};
ScratchDetectALG
的实现
// ScratchDetectALG.cpp
#include "ScratchDetectALG.h"
ScratchDetectALG::ScratchDetectALG()
{
}
ScratchDetectALG::~ScratchDetectALG()
{
}
bool ScratchDetectALG::inital(const string& enginePath)
{
// your task
return true;
}
void ScratchDetectALG::detect(const Mat& inputImg, const InputParam4Yolo& inpara, ResultData4Yolo& resData)
{
// your task
}
2.3 子类ScratchDetectALG
的导出
// dllexport.h
#ifdef SCRATCHYOLOV5_EXPORTS
#define SCRATCHYOLOV5_API __declspec(dllexport)
#else
#define SCRATCHYOLOV5_API __declspec(dllimport)
#endif
#include "ScratchDetectALG.h"
extern "C"
{
SCRATCHYOLOV5_API ScratchDetectALG* GetScratchALG();
}
// dllexport.cpp
#include "stdafx.h"
#include "dllexport.h"
#include "ScratchDetectALG.h"
extern "C"
{
SCRATCHYOLOV5_API ScratchDetectALG* GetScratchALG()
{
return new ScratchDetect;
}
}
3. 类的显式调用
通过第二部分,可以生成YoloV5.dll
,下面我们利用ALG.h
以该DLL
进行显式调用。
#include <iostream>
#include <windows.h>
#include "ALG.h"
// 声明函数指针及其别名
typedef ALG* (*CreateALG)();
int main()
{
HINSTANCE hDll = LoadLibrary(L"YoloV5.dll");
if (hDll==NULL)
{
cout << "Failed to load DLL." << endl;
return -1;
}
CreateALG creatAlg = reinterpret_cast<CreateALG>(GetProcAddress(hDll, "getALG"));
if (!creatAlg)
{
cout << "unable to load getALG from DLL" << endl;
return -1;
}
ALG* alg;
alg = creatAlg();
string path = "E:\\TensorRT PRJ\\YoloV5\\Model\\yolov5s.engine";
alg->inital(path);
Mat inputImg=imread("myImg.jpg");
vector<Rect> vRect;
alg->detect(inputImg,vRect);
return 1;
}
4. 总结
本文介绍了一种类的导出方法,通过这种类的导出方法,可以使代码具有更好的隐蔽性,特别是在类中依赖的头文件较多时,效果更明显。
参考链接: