在重构之前的问题之前,我认为这个问题有点不对......
标题几乎问我的问题。
如何在不给出方法和方法的情况下自行保留类定义?产生以下错误?
原因是因为我想在一个单独的DLL(包含方法)中创建一个对象,但只返回一个指向我主程序的引用指针。 顺便说一下,这是明确的出口。
错误1错误LNK2001:未解析的外部符号“public:int __thiscall ObjTest :: getValue(void)“(?getValue @ ObjTest @@ QAEHXZ)
class ObjTest
{
private:
int x;
public:
int getValue();
};
答案 0 :(得分:2)
由于您需要使用LoadLibrary()加载.dll,因此您可以公开纯虚拟类,并让.dll返回它的子类:
您将它们分成两个文件:
文件ObjTest.h:
class ObjTest
{
public:
virtual int getValue() = 0;
};
ObjTest *CreateObjTest();
文件ObjTest.cpp:
#include "ObjTest.h"
class ObjTestImpl : public ObjTest
{
int x;
public:
virtual int getValue();
};
int ObjTestImpl::getValue()
{
return x;
}
ObjTest *CreateObjTest()
{
return new ObjTestImpl();
}
编译ObjTest.cpp并从中创建一个.dll。你的主要可执行程序需要LoadLibrary()你的.dll,使用GetProcAddress()
提取CreateObjTest
作为函数指针并调用它来返回一个新的ObjTest。
(您可能还需要创建DeleteObjTest()
函数 - 如果您的主可执行文件和.dll最终使用不同的CRT,它们将具有不同的堆,因此您需要调用.dll而不是只是做delete myObj
。)
另一种方法是将每个包装在C API中,并且只在.dll中将不透明句柄传递给C函数,而不是处理C ++对象。
答案 1 :(得分:0)
您的定义和实施令人困惑。您已定义方法但未实现。因此,编译器在没有错误的情况下编译代码,因为定义了方法,链接器会创建一个错误,因为该方法没有实现(未定义的符号)。
DevStudio编译器允许您将DLL中的类导入应用程序: -
class __declspec (dllimport) ClassName
{
// members, etc
}
并在DLL源代码中,将“dllimport”更改为“dllexport”。
有关详细信息,请参阅this MSDN article。
如果您想要隐藏数据成员和私有方法,那么您需要查看pimpl idiom。