是否可以在不声明其方法的情况下保留裸类定义?
Is it possible to keep a naked class definition without declaring it's methods?
在重构我之前的问题之前,我认为这个问题有点不对劲......
标题几乎问了我的问题。
如何在不给它方法和产生以下错误的情况下保留一个类定义?
这样做的原因是我想在单独的 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习惯用法。
- 在没有太多条件句的情况下,我如何避免被零除
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 在未初始化映射的情况下,将值插入到映射的映射中
- 是默认情况下分配给char数组常量的值
- 为什么我不能在不创建字符串变量的情况下使用函数的字符串输出
- 如何在不产生任何垃圾的情况下获得C中的像素
- 在已经使用Git的情况下减少编译时间
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- 如何在没有信号的情况下从C++执行QML插槽
- 如何在不知道向量大小的情况下输入向量内部的向量?
- 为什么在某些情况下不写入此文件?
- 如何从 std::optional 中获取 QByteArray<QByteArray>,并在没有其他 malloc 的情况下保留 std::nullopt?
- 如何在不增加矢量大小的情况下保留多维矢量?
- 是否可以在不声明其方法的情况下保留裸类定义?
- 如何在不复制和保留 std::string 对象的情况下获得 C++ std::string 字符数据的所有权
- 在哪些情况下,我应该保留多个目标,而不是在生成文件中保留一个目标
- 如何在不初始化每个元素的情况下为数组保留空间
- c++在不知道其参数的情况下保留对模板实例的引用
- 对容器进行排序,然后在保留原始排序的情况下移动元素
- 在没有文件支持的情况下保留共享内存(Linux/Windows) (boost::interprocess)