我正在处理各种插件协议。我们的想法是,有一个基本的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->黑/白运算符 - 是的,这些将是图形插件,并忽略输入/输出缓冲区的类型..它们只是占位符点。
#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 ++最有意义的是在类中封装这些数据(这是关于作为工厂本身的类),无论是通过成员还是方法
答案 0 :(得分:0)
它与DLL没有任何关系,你声明了静态成员,但你忘了定义它。将此行添加到BlackNWhite.cpp:
PCOperatorBase::OperatorInfo* CBlackNWhite::operatorInfo = NULL;