C++ 从指针构造
Posted
技术标签:
【中文标题】C++ 从指针构造【英文标题】:C++ Construct from pointer 【发布时间】:2016-05-26 13:35:11 【问题描述】:我正在尝试使我的项目符合 GCC 以链接到使用 MSVC 编译的库(我没有源代码)。问题是这个库也存在于用 GCC 编译的 linux x86、x86_64 和 arm 平台(我的项目是跨平台的),我不想编写很多平台相关(和编译器相关)的代码。此外,链接到项目的其他库被设计为由 GCC 编译(如 ffmpeg 和 vlc),我无法迁移到 MSVC。 为此,我编写了 C 风格的包装库(基于原始头文件)。
类的构造函数和析构函数是这样完成的:
__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 编译并链接到我的项目。它应该基于库的原始头文件(以确保它与该库的 linux 和 windows 版本的原始文件相同)。我怀疑如何制作类的构造函数和析构函数。 假设我们有
class MyClass
public:
MyClass()
~MyClass()
在原始标题中。
如何在 .cpp 中定义它以绕过对我的 c 风格“构造函数”和“析构函数”的调用(因此它们将绕过对原始构造函数和析构函数的调用)?
在构造函数中分配指向this
的指针会很好,但这是被禁止的。
附:我没有类的内部结构。他们都有
private: myClassImpl* m_pImpl;
所以我不能使用复制构造函数。即使我可以 - 我也不想构造 2 次相同的对象。
【问题讨论】:
“绕过”是什么意思?也没有理由使用void*
。使用MyClass*
。如果需要纯C理解,可以使用struct MyClass*
(或者使用typedef)。
@ymett 我的意思是调用我的 C 风格的“构造函数”以某种方式形成 myClass 的原始构造函数,并将返回的指针作为指向创建的类的指针。也许您使用myClass*
而不是void*
是对的,但是如果C 中没有“指向类的指针”之类的东西怎么办?
我不认为“绕过”是你想要的词。结构和类在 C++ 中是一回事,C 有指向结构的指针。
@ymett 是的,你是对的,我的意思是将呼叫转发到另一个函数。好吧,即使它们是相同的——这不是我想要做的。我要做的是调用原始标头中定义的本机构造函数,并使其将指向从 myClass_myClass 返回的对象的指针作为新构造的对象
【参考方案1】:
你的包装类应该是一个句柄类,它在构造函数中调用myClass_myClass()
,将返回的指针存储为成员,并在存储的指针的析构函数中调用myClass_unmyClass()
。原始类中的所有成员函数都应复制到包装器中,但只需在存储的指针上调用原始函数(通过包装器“C”函数)。小心复制构造函数和复制赋值运算符——默认值不会做正确的事情。您必须删除它们或实现它们以调用适当的包装“C”函数。
【讨论】:
这个方案不错,我想了想。但这个想法不是改变库的原始标题(因为正如我所说,这个库的 linux 版本具有相同的类,可以正常工作)。但!也许我可以使用 myClassImpl* m_pImpl 变量来存储这个指针。这将调用构造函数 2 次(一次用于包装类,一次用于原始类),这是我试图避免的,但无论如何它可能会成功。以上是关于C++ 从指针构造的主要内容,如果未能解决你的问题,请参考以下文章