【问题标题】:Cast between C++ class and C structure -- what to do with the destructor?在 C++ 类和 C 结构之间转换——如何处理析构函数?
【发布时间】:2021-03-10 08:28:39
【问题描述】:

可以在C++ classC structure 之间转换吗? (这里的用例是我有两个不同的项目,一个在C++,另一个在C,我有一个接口可以连接两个项目)

我尝试了一些示例,其中两个(C++ classC structure)具有相同的成员函数和成员变量,并且效果很好。但是一旦它们中的任何一个缺少成员函数/变量,它就不起作用并且强制转换不会为成员变量提供正确的值。

我注意到的一件事是,如果我向 C++ class 添加析构函数,只要未定义析构函数 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

【问题讨论】:

  • 去掉= (myStru*)malloc(sizeof( myStru)),否则会导致内存泄漏。
  • previous question 的答案已经告诉你不能这样做(因为它会调用 未定义的行为),这有什么不同?
  • 这能回答你的问题吗? stackoverflow.com/questions/65037779/…
  • @UnholySheep 这里有一些答案(例如@Ted Lyngmo 的答案)表明这是可能的。我会保留这两个问题,因为这里的答案很有用。此外,这个问题主要是关于类的析构函数。我同意这两个问题相对接近,但这里的答案更有用。
  • @idclev463035818 这里的答案更有用。我在这里提出了不同的问题,希望得到其他答案,现在就是这种情况。请参阅下面的@ Ted Lyngmo 的回答,这很有帮助。谢谢!

标签: c++ c struct


【解决方案1】:

一种方法是根本不强制转换,而是让 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 部分的副本。

【讨论】:

  • 非常感谢!你的回答很有帮助,这正是我想知道的!
【解决方案2】:

您不能直接投射,因为它会导致 UB。如果您将连接接口作为 .cpp 文件而不是 .c 文件,那么您可以使用函数进行转换。 比如:

myStru classToStruct(myClass& classObj) {
    myStru result;
    result.var = classObj.var;
    return result;
}

它并不完全优雅,但它会起作用。可能值得考虑重组项目,例如从其他人提到的结构继承类。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-31
    • 2012-10-15
    • 2011-02-19
    • 1970-01-01
    • 1970-01-01
    • 2010-11-08
    相关资源
    最近更新 更多