是否可以在C++类
和C结构
之间强制转换?(这里的用例是我有两个不同的项目,一个在C++
中,另一个在C
中,我有一个接口来连接这两个项目)
我已经尝试了一些示例,其中(C++类
和C结构
)具有相同的成员函数和成员变量,并且工作得很好。但是一旦缺少成员,函数/变量,它们中的任何一个都不能工作,并且强制转换不能为成员变量提供正确的值。
我注意到的一件事是,如果我向C++类
添加析构函数,只要析构函数没有定义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
你不能直接施放,因为它会导致UB。如果连接接口是。cpp文件,而不是。c,那么可以使用函数进行转换。类似于:
myStru classToStruct(myClass& classObj) {
myStru result;
result.var = classObj.var;
return result;
}
虽然不是很优雅,但还是可以的。重新构建项目可能是值得考虑的,例如,正如其他人提到的那样,从结构继承类。
一种方法是完全不进行强制转换,而是让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
是x
的mystru
部分的副本。