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

Is it possible to keep a naked class definition without declaring it's methods?

本文关键字:保留 情况下 定义 方法 声明 是否      更新时间:2023-10-16

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

标题几乎问了我的问题。

如何在不给它方法和产生以下错误的情况下保留一个类定义?

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

错误

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

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

由于您需要使用 LoadLibrary() 加载.dll,因此您可以公开一个纯虚拟类,并让.dll返回它的子类:

将它们分隔在两个文件中:

File ObjTest.h:

class ObjTest
{
public:
    virtual int getValue() = 0;
};
ObjTest *CreateObjTest();

File 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++对象。

你混淆了定义和实现。您已经定义了方法,但尚未实现。因此,编译器编译代码时没有错误,因为定义了方法,链接器会创建错误,因为该方法没有实现(未定义的符号)。

DevStudio 编译器允许您将类从 DLL 导入到应用程序中:-

class __declspec (dllimport) ClassName
{
  // members, etc
}

在 DLL 源中,将"dllimport"更改为"dllexport"。

有关详细信息,请参阅此 MSDN 文章。

如果要隐藏数据成员和私有方法,则需要查看pimpl习惯用法。

相关文章: