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: a RGB->black / white operator -- はい、これらはグラフィック プラグになり、in / out バッファーの型は無視されます。この点。

#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

構造体は基本クラス内で定義され、基本クラスがエクスポートしているため、構造体もエクスポートされると思いました。しかし、私は間違っていると思いますか?

では、どのようにすればよいのでしょうか。

それに関係なく、静的クラスメンバーよりもインスタンス化を必要とせずに、プラグのファクトリに名前、タイプ、およびサブタイプをエクスポートさせるためのより良いアプローチはありますか? たとえば、リソース ファイルですか。または、別のextern "C"関数でさえこの情報を返す可能性があります..しかし、それはC ++であるため、メンバーを介しているかどうかにかかわらず、クラス内にこのデータ(ファクトリ自体としてのクラスに関するもの)をカプセル化するのが最も理にかなっていると感じました.または方法。

4

1 に答える 1

0

DLL とは関係ありません。静的メンバーを宣言しましたが、定義するのを忘れていました。次の行を BlackNWhite.cpp に追加します。

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