提问者:小点点

C++类和C结构之间的强制转换-析构函数怎么办?


是否可以在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

共2个答案

匿名用户

你不能直接施放,因为它会导致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';
}

现在,pxmystru部分的副本。

相关问题


MySQL Query : SELECT * FROM v9_ask_question WHERE 1=1 AND question regexp '(c++|类|c|结构|之间|强制|转换|析|构|函数)' ORDER BY qid DESC LIMIT 20
MySQL Error : Got error 'repetition-operator operand invalid' from regexp
MySQL Errno : 1139
Message : Got error 'repetition-operator operand invalid' from regexp
Need Help?