利用C++实现插件系统
插件机制能够方便地扩展已有应用程序的功能。用C++实现插件机制的基本思路是:应用程序提供接口,由用户或第三方实现这些接口,并编译出相应的动态链接库(即插件);将所有插件放到某个特定目录,应用程序运行时会自动搜索该目录,并动态加载目录中的插件。
应用程序提供接口
为了实现功能扩展,应用程序必须向插件提供接口。在base.h中定义一个抽象类Base作为接口:
#ifndef BASE_H_
#define BASE_H_
class Base {
public:
virtual ~Base() = default;
virtual void print(void) = 0;
virtual double calc(double val) = 0;
};
#endif
实现插件
插件应该包含并实现应用程序提供的接口。在test1.h中定义Test1,让Test1继承并实现Base中提供的所有接口:
#ifndef TEST1_H_
#define TEST1_H_
#include <iostream>
#include <cmath>
#include "main.h"
class Test1 : public Base {
public:
void print(void) {
std::cout << "Hello Everybody! Test1!" << std::endl;
}
double calc(double val) {
return sqrt(abs(val / 5 * 1.61));
}
};
#endif
为了让应用程序动态加载插件,需要将插件编译为dll文件。在main.h中,插件声明两个导出函数:
- getObj:用于新建一个Test1对象并返回该对象的指针;
- getName:用于打印Test1相关信息。
#ifndef __MAIN_HPP_INCLUDED__
#define __MAIN_HPP_INCLUDED__
#define BUILD_DLL