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
类
#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
类.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;
}
}
}
主(在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
->如果我将
Class.h
包含在主要错误中,则会发生以下错误:LNK2019: unresolved external symbol
:添加class __declspec(dllexport) Class : public IClass
可解决此链接程序问题,但是可以这样做吗?->我也不能这样做:
std::shared_ptr<IClass> test = std::make_shared<IClass>();
(因为不允许创建抽象类的对象)我该如何解决这个问题,这是最佳实践吗?
最佳答案
如果您希望EXE分配新的“Class”对象,则EXE代码必须知道Class类型。如果要使EXE中的类类型未知,一种解决方法可能是从DLL中导出工厂函数,该函数将构造一个类对象并将其作为IClass指针返回。
参见How to implement the factory pattern in C++ correctly