>source

사이에 캐스팅 가능 C++ classC structure ? (여기서 사용 사례는 두 개의 서로 다른 프로젝트가 C++ 그리고 다른 하나는 C 두 프로젝트를 연결하는 인터페이스가 있습니다.)

나는 둘 다 (a C++ class 그리고 C 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

  • 답변 # 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';
    }
    
    

    지금, p 의 사본입니다 myStru 부분의 x .

  • 답변 # 2

    UB를 유발하므로 직접 전송할 수 없습니다. .c가 아닌 .cpp 파일로 연결 인터페이스가 있다면 함수로 변환 할 수 있습니다. 다음과 같은 것 :

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

    정확히 우아하지는 않지만 작동합니다. 예를 들어 다른 사람들이 언급 한 것처럼 구조체에서 클래스를 상속하는 것과 같이 프로젝트를 재구성하는 방법을 살펴볼 가치가 있습니다.

  • 이전 python - 인덱스를 기반으로 문자열 목록 분할
  • 다음 c# - Unity ResourceLoad ()는 타사 라이브러리 콜백에서 호출하면 충돌합니다