【发布时间】:2021-03-10 06:18:01
【问题描述】:
我有两个项目,一个在 C 中,另一个在 C++ 中,我尝试将 C++ 中的类对象转换为 C 中的结构对象。例如,我有一个来自 myClass 的对象,我试图将其转换为 myStru如下:
在我的 C++ 项目中,我有这个类:
class myClass{
myClass();
~myClass();
char *data;
int var;
}
在我的 C 项目中,我有这样的结构:
struct myStru {
char *data;
int var;
};
typedef struct myStru myStru;
现在在我的 C++ 项目中,我从 myClass 创建一个对象:
myClass *classObj = new myClass();
classObj->data = new char[10];
classObj->var = 99;
在我的 C 项目中,我收到 classObj 作为 void 指针,我尝试将其转换如下:
myStru *struObj = (myStru*)malloc(sizeof(struct myStru));
struObj = (myStru*) classObj;
printf(" struObj->var %d \n", struObj->var); // this print 99
我稍后会在我的 C++ 项目中这样做
delete []classObj->data; // I know smart pointers can be used here but this is not my point in this question now
delete classObj;
我在这里做的对吗?即,以这种方式将classObj 转换为struObj?
完整的例子可以在这里找到(感谢@Borgleader) http://coliru.stacked-crooked.com/a/05543b944ee23f2f
编辑: 我在这篇文章中找到了我的问题的一个很好的答案(请参阅从 C 中访问 C++ 类): https://www.oracle.com/technical-resources/articles/it-infrastructure/mixing-c-and-cplusplus.html
【问题讨论】:
-
我相信这是未定义的行为,因为类型不同。
-
如果您实际上同时使用 C 和 C++,请在问题中澄清。大多数情况下,当只有一个合适时,这两者被错误地标记在一起
-
我很确定它是 UB,因为这些类型不兼容,但我正在努力证明这一点。
-
Structs 可以作为基类,所以使用 myStru 作为 myClass 的基类。
-
AFAICT,没有明确定义的方法可以在它们之间进行转换(然后访问它们)。正确的做法是定义
myStru结构并从中派生myClass。 (此外,您的“C”示例使用 C++ 并存在内存泄漏。)