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++ 从指针构造的主要内容,如果未能解决你的问题,请参考以下文章

C++函数指针与成员函数指针

多次调用构造函数会改变C++中的成员指针地址

复制构造函数 C++ 没有正确复制指针

C++构造奇怪的未初始化指针

是否可以定义指向构造函数的函数指针?

C++之拷贝构造与拷贝赋值