我正在研究某种插件协议。这个想法是有一个基类 PCOperatorBase 并且插件将继承这个基类以通过它们覆盖的“进程”虚拟方法提供特定的功能。子类还应该有一个包含典型插件信息的静态结构成员:插件名称、类型和子类型。另一个类(PCOperatorManager)使用此信息来了解正在处理的插件类型。而且我考虑让它成为一个静态成员,这样就不需要实例化一个插件来仅仅找出它的运算符类型。
我有以下课程:
PCOperatorBase.h派生所有其他插件的超类:
#ifdef PCOPERATORBASE_EXPORTS
#define PCOPERATORBASE_API __declspec(dllexport)
#else
#define PCOPERATORBASE_API __declspec(dllimport)
#endif
class PCOPERATORBASE_API PCOperatorBase
{
public:
typedef struct OperatorInfo
{
wchar_t* name;
wchar_t* type;
wchar_t* subtype;
} OperatorInfo;
PCOperatorBase(void);
virtual ~PCOperatorBase(void);
virtual int process(int* inBuffer, int* outBuffer, int bufferSize);
};
然后,例如,一个子类: BlackNWhite.h:一个 RGB->black / white 运算符——是的,这些将是图形插件,并且忽略输入/输出缓冲区的类型。它们只是占位符这点。
#ifdef BLACKNWHITE_EXPORTS
#define BLACKNWHITE_API __declspec(dllexport)
#else
#define BLACKNWHITE_API __declspec(dllimport)
#endif
// This class is exported from the BlackNWhite.dll
class BLACKNWHITE_API CBlackNWhite : PCOperatorBase
{
public:
static PCOperatorBase::OperatorInfo* operatorInfo;
CBlackNWhite(void);
virtual ~CBlackNWhite(void);
//virtual int process(int* inBuffer, int* outBuffer, int bufferSize);
};
BLACKNWHITE_API CBlackNWhite* getOperatorInstance();
BLACKNWHITE_API const PCOperatorBase::OperatorInfo* getOperatorInfo();
这里是实现文件: BlackNWhite.cpp:
#include "stdafx.h"
#include "BlackNWhite.h"
BLACKNWHITE_API CBlackNWhite* getOperatorInstance()
{
return new CBlackNWhite();
}
BLACKNWHITE_API const PCOperatorBase::OperatorInfo* getOperatorInfo()
{
return CBlackNWhite::operatorInfo;
}
CBlackNWhite::CBlackNWhite()
{
}
CBlackNWhite::~CBlackNWhite()
{
}
现在,我尝试了几种方法,但由于静态成员,我无法编译 DLL。链接器抛出:
\BlackNWhite.lib and object c:\Projects\BlackNWhite\Debug\BlackNWhite.exp
1>BlackNWhite.obj : error LNK2001: unresolved external symbol "public: static struct PCOperatorBase::OperatorInfo * CBlackNWhite::operatorInfo" (?operatorInfo@CBlackNWhite@@2PAUOperatorInfo@PCOperatorBase@@A)
1>c:\Projects\BlackNWhite\Debug\BlackNWhite.dll : fatal error LNK1120: 1 unresolved externals
我认为由于结构是在基类中定义的并且基类正在导出,因此结构也会导出。但我想我错了?
那么我应该怎么做呢?
不管怎样,有没有比静态类成员更好的方法让插头的工厂导出它们的名称、类型和子类型而不需要实例化?例如,资源文件?甚至另一个外部“C”函数可以返回此信息。但我只是觉得,因为它是 C++,所以将这些数据(这是关于作为工厂本身的类)封装在类中是最有意义的,无论是通过成员或方法。