使用接口从dll导出类

时间:2013-10-15 23:02:45

标签: c++ dll interface

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

- &GT;如果我在主要跟踪错误中包含Class.hLNK2019: unresolved external symbol:添加class __declspec(dllexport) Class : public IClass解决此链接器问题,但是可以这样做吗?

- &GT;我也不能这样做:std::shared_ptr<IClass> test = std::make_shared<IClass>(); (因为它不允许创建抽象类的对象)

如何解决这个问题,这是最佳做法?

1 个答案:

答案 0 :(得分:1)

如果您希望您的EXE分配新的&#34; Class&#34;对象,EXE代码必须知道Class类型。如果你想从EXE中保持Class类型未知,一个解决方案可能是从你的DLL导出一个工厂函数,它将构造一个Class对象并将其作为IClass指针返回。

请参阅How to implement the factory pattern in C++ correctly