3

IClass (私のインターフェース):

#ifndef _ICLASS_H
#define _ICLASS_H

#include <sstream>

namespace Test
{
    class __declspec(dllexport) IClass
    {
    public:     
        virtual ~IClass() {}                

        virtual bool Init(const std::string &path) = 0;     
    };
}

#endif

Class.h

#ifndef _CLASS_H
#define _CLASS_H

#include "IClass.h"
#include <memory>
#include <sstream>
#include <stdio.h>

namespace Test
{
    class Class: public IClass
    {
    public:
        Class();
        ~Class();               

        bool Init(const std::string &path);         
    };
}

#endif

Class.cpp

#include "Class.h"

namespace Test
{
    Class::Class()
    {       
    }

    bool Class::Init(const std::string &path)
    {
        try
        {
            // do stuff

            return true;
        }
        catch(std::exception &exp)
        {
            return false;
        }
    }   
}

main (exe では、暗黙的にリンクされた dll)

#include "IClass.h"

using namespace Test;

int main(int argc, char* argv[])
{
    std::shared_ptr<IClass> test = std::make_shared<Class>(); // error: unreferenced Class

    test->Init(std::string("C:\\Temp"));
}

現時点ではクラスは宣言されていません

-> メインにインクルードClass.hすると、次のエラーが発生します: LNK2019: unresolved external symbol: add class __declspec(dllexport) Class : public IClassresolve this linker issue, but is it ok it do it this way?

->これもできません:(std::shared_ptr<IClass> test = std::make_shared<IClass>(); 抽象クラ​​スのオブジェクトを作成することは許可されていないため)

この問題を解決するにはどうすればよいですか? また、これがベスト プラクティスですか?

4

1 に答える 1

2

EXE で新しい「クラス」オブジェクトを割り当てたい場合、EXE コードはクラス タイプを認識している必要があります。Class 型を EXE から認識しないようにしたい場合、1 つの解決策として、DLL からファクトリ関数をエクスポートすることが考えられます。この関数は、Class オブジェクトを構築し、それを IClass ポインタとして返します。

C++ でファクトリ パターンを正しく実装する方法を参照してください。

于 2013-10-16T07:49:18.580 に答える