是否可以在不声明其方法的情况下保持裸体类定义?

时间:2014-01-16 13:43:22

标签: c++ class methods linker-errors definition

在重构之前的问题之前,我认为这个问题有点不对......

标题几乎问我的问题。

如何在不给出方法和方法的情况下自行保留类定义?产生以下错误?

原因是因为我想在一个单独的DLL(包含方法)中创建一个对象,但只返回一个指向我主程序的引用指针。 顺便说一下,这是明确的出口。

  

错误1错误LNK2001:未解析的外部符号“public:int   __thiscall ObjTest :: getValue(void)“(?getValue @ ObjTest @@ QAEHXZ)

class ObjTest
{
private:
    int x;
public:
    int getValue();
};

2 个答案:

答案 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