0

我正在研究某种插件协议。这个想法是有一个基类 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++,所以将这些数据(这是关于作为工厂本身的类)封装在类中是最有意义的,无论是通过成员或方法。

4

1 回答 1

0

它与 DLL 没有任何关系,您声明了静态成员但您忘记定义它。将此行添加到 BlackNWhite.cpp:

PCOperatorBase::OperatorInfo* CBlackNWhite::operatorInfo = NULL;
于 2012-04-10T01:41:03.453 回答