gpt4 book ai didi

C++ 从指针构造

转载 作者:行者123 更新时间:2023-11-28 05:39:32 24 4
gpt4 key购买 nike

我正在尝试使我的项目符合 GCC 以链接用 MSVC 编译的库(我没有源代码)。问题是这个库也存在于用 GCC 编译的 linux x86、x86_64 和 arm 平台(我的项目是跨平台的),我不想写很多平台相关(和编译器相关)的代码。此外,链接到项目的其他库被设计为由 GCC 编译(如 ffmpeg 和 vlc),我无法迁移到 MSVC。为此,我编写了 C 风格的包装器库(基于原始 header )。

类的构造函数和析构函数是这样完成的:

__declspec(dllexport) void* myClass_myClass()
{
void* ptr = new myClass();
return ptr;
}
__declspec(dllexport) void myClass_unmyClass(void* ptr)
{
delete((myClass*)ptr);
}

这部分是用 MSVC 编译并链接到原始库。如您所见(我可以在 dependency walker 中看到)我有可以与 GCC 链接的 c 样式导出。它分配内存、创建对象并按设计运行。

现在我正在编写这个包装器的第二部分,它将包含类并将使用 GCC 编译并链接到我的项目。它应该基于库的原始 header (以确保它与该库的 linux 和 windows 版本的原始 header 一样)。而且我怀疑如何制作类的构造函数和析构函数。假设我们有

class MyClass
{
public:
MyClass()
~MyClass()
}

在原始标题中。

如何在 .cpp 中定义它以绕过对我的 c 风格“构造函数”和“析构函数”的调用(这样它们将绕过对原始构造函数和析构函数的调用)?在构造函数中将指针分配给 this 会很棒,但这是被禁止的。

附言我没有类的内部结构。他们都有

private: myClassImpl* m_pImpl;

所以我不能使用复制构造函数。即使我可以 - 我也不想构造 2 次相同的对象。

最佳答案

您的包装类应该是一个句柄类,它在构造函数中调用 myClass_myClass(),将返回的指针存储为成员,并在析构函数中调用 myClass_unmyClass()在存储的指针上。原始类中的所有成员函数都应复制到包装器中,但只需在存储的指针上调用原始函数(通过包装器“C”函数)。小心复制构造函数和复制赋值运算符——默认值不会做正确的事情。您必须删除它们或实现它们以调用适当的包装器“C”函数。

关于C++ 从指针构造,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37462447/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com