c++ - 在 C++ 类和 C 结构之间转换——如何处理析构函数?
问题描述
可以在C++ class
and之间转换C structure
吗?(这里的用例是我有两个不同的项目,一个在C++
,另一个在C
,我有一个接口来连接两个项目)
我尝试了一些示例,其中(aC++ class
和 a C structure
)都具有相同的成员函数和成员变量,并且效果很好。但是,一旦它们中的任何一个缺失成员函数/变量不起作用并且强制转换不会为成员变量提供正确的值。
我注意到的一件事是,如果我向C++ class
this 添加一个析构函数,只要没有定义析构函数就可以正常工作virtual
?
在C++
:
class myClass{
public:
myClass() {}
~myClass(){} // if I define this destructor as virtual the casting fails
int var;
};
在C
:
struct myStru {
int var;
};
铸造C
myStru *struObj = (myStru*)malloc(sizeof( myStru));
struObj = (myStru*) classObj; // classObj is a void pointer that is passed to the `C` project and it was created in the `C++` project
编辑:我在本文中找到了一个很好的答案(请参阅从 C 访问 C++ 类): https://www.oracle.com/technical-resources/articles/it-infrastructure/mixing-c-and-cplusplus。 html
解决方案
一种方法是根本不强制转换,而是让 C++ 类从 C 结构继承。
例子:
#include <iostream>
// #include "the_c_header.h"
class myClass : public myStru {
public:
myClass(int v) : myStru{v} {}
virtual ~myClass() = default;
};
class der : public myClass {
public:
using myClass::myClass;
private:
int not_copied;
};
int main() {
der x(123);
myStru p = x;
std::cout << p.var << '\n';
}
现在,p
是myStru
部分的副本x
。
推荐阅读
- java - 将语言区域设置到数组中以在循环中使用
- android - 为什么我们设计UI的Android Studio的编辑区域或主要活动看不到?
- c# - 尝试使用 xsd.exe .NET 实用程序从 C# 类生成 XSD 时出错
- html - 无法以 Angular 5 进行生产构建
- rabbitmq - 如何在 RabbitMQ 中获取 LVC 交换以在 RabbitMQ 执行中持久保存缓存值?
- pandas - 扩展比较数据框的列并返回差异
- java - 如何在java中将通用对象添加到列表中?
- magento - Magento 的 Authorize.Net Direct Post - 尝试向商家报告此交易时发生错误
- c# - 从 Cert 和 Key 创建 X509Certificate2,而不制作 PFX 文件
- microsoft-teams - 在 Microsoft Teams 中将机器人添加到哪个频道(不是团队)的通知