문제

다음과 같이 수업이있는 경우

   class Example_Class 
   {
       private:
         int x; 
         int y; 
       public: 
         Example_Class() 
         { 
             x = 8;
             y = 9;
         }
       ~Example_Class() 
       { } 
   };

그리고 다음과 같이 구조물

struct
{
   int x;
   int y;
} example_struct;

메모리의 구조입니다 example_struct 그것에 대해 Simmilar Example_Class

예를 들어 다음을 수행하는 경우

struct example_struct foo_struct;
Example_Class foo_class = Example_Class();

memcpy(&foo_struct, &foo_class, sizeof(foo_struct));

~ 할 것이다 foo_struct.x = 8 그리고 foo_struct.y = 9 (예 : foo_class의 x, y 값과 같은 값)?

내가 묻는 이유는 C 코드와 객체를 공유하는 C ++ 라이브러리 (변경하고 싶지 않음)가 있고 C ++ 라이브러리에서 오는 개체를 나타내는 구조물을 사용하고 싶습니다. 나는 객체의 속성에만 관심이 있습니다.

이상적인 상황은 example_class 랩이 C와 C ++ 코드 사이의 공통 구조를 Arround하는 것이지만 사용중인 C ++ 라이브러리를 쉽게 변경하지는 않을 것입니다.

도움이 되었습니까?

해결책

C ++ 표준 보증 C의 메모리 레이아웃 struct 그리고 C ++ class (또는 struct -C ++가 동일합니다. class/struct 존재의 기준에 맞습니다 현물 상환 지불 ( "평범한 오래된 데이터"). 그렇다면 포드는 무엇을 의미합니까?

클래스 또는 구조물은 POD입니다.

  • 모든 데이터 멤버는 공개 및 자체 포드 또는 기본 유형 (참조 또는 포인터 간 유형이 아님) 또는 그러한 배열입니다.
  • 사용자 정의 생성자, 과제 연산자 또는 소멸자가 없습니다.
  • 가상 기능이 없습니다
  • 기본 클래스가 없습니다

허용되는 유일한 "C ++ -ISMS"는 비당파 멤버 함수, 정적 멤버 및 멤버 함수입니다.

클래스에는 생성자와 소멸자가 모두 있으므로 공식적으로 포드 유형이 아니므로 보증은 보관되지 않습니다. (다른 사람들이 언급했듯이, 실제로 두 레이아웃은 가상 함수가없는 한 시도하는 모든 컴파일러에서 동일 할 수 있습니다).

섹션 [26.7]을 참조하십시오 C ++ FAQ 라이트 자세한 사항은.

다른 팁

example_struct의 구조는 example_class의 그 구조입니다.

동작은 보장되지 않으며 컴파일러에 따라 다릅니다.

example_class에 가상 메소드가 포함되어 있지 않으며 (기본 클래스에서 상속되지 않음) 대답은 "예, 내 컴퓨터에서"라고 대답한다고 말했습니다.

당신이 설명하는 경우, 대답은 "아마도 예"입니다. 그러나 클래스에 가상 함수가있는 경우 (기본 클래스에서 상속 될 수있는 가상 파괴자 포함) 또는 여러 상속을 사용하면 클래스 레이아웃이 다를 수 있습니다.

다른 사람들이 말한 내용에 추가하려면 (예 : 컴파일러에 따라, 가상 기능이없는 한) :

이 작업을 수행하는 경우 sizeof (example_class) == sizeof (example_struct)가 정적 인제 (Compile-Time Check)를 강력히 제안합니다. roost_static_assert 또는 동등한 컴파일러 특정 또는 사용자 정의 구성을 참조하십시오. 누군가 (또는 컴파일러 변경과 같은 사람)가 클래스를 수정하여 경기를 무효화하는 경우 이것은 좋은 방어입니다. 추가 점검을 원한다면 멤버에 대한 오프셋이 동일했는지 확인할 수도 있습니다. (정적 크기 어제와 함께) 정확성을 보장합니다.

C ++ 컴파일의 초기에는 컴파일러가 구조물 키워드를 클래스로 변경 한 다음 컴파일 할 때의 예가있었습니다. 유사성에 대해 너무 많이.

차이점은 클래스 상속, 특히 가상 기능에서 비롯됩니다. 클래스에 가상 함수가 포함 된 경우 레이아웃 시작시 설명자를 입력하는 포인터가 있어야합니다. 또한 클래스 B가 클래스 A에서 상속되면 클래스 A의 레이아웃이 먼저 나오고 클래스 B의 자체 레이아웃이 이어집니다.

따라서 클래스 인스턴스를 구조 인스턴스에 캐스팅하는 것에 대한 질문에 대한 정확한 답변은 다음과 같습니다. 클래스 내용에 따라 다릅니다. 방법 (생성자 및 비 약성 파괴자)이있는 특정 클래스의 경우 레이아웃이 동일 할 것입니다. 파괴자가 가상으로 선언되면 레이아웃은 구조와 클래스간에 분명히 달라집니다.

다음은 C 구조에서 C ++ 클래스로 단계를 밟을 필요가 없음을 보여주는 기사입니다. 레슨 1- 구조에서 클래스로

그리고 가상 기능 테이블이 가상 함수가있는 클래스에 어떻게 소개되는지 설명하는 기사는 다음과 같습니다. 레슨 4- 다형성

C ++의 클래스 및 structs는 기본적으로 구조물의 모든 구성원이 공개적이라는 점을 제외하고는 동일합니다 (클래스 멤버는 기본적으로 비공개 임). 이를 통해 C ++ 컴파일러에서 레거시 C 코드를 컴파일하는 것이 예상대로 작동합니다.

구조물에서 모든 멋진 C ++ 기능을 사용하는 것을 막는 것은 없습니다.

struct ReallyAClass
{
    ReallyAClass();
    virtual !ReallAClass();

    /// etc etc etc
};

데이터를 C에 전달하려고 할 때 클래스 멤버를 구조물에 명시 적으로 할당하지 않겠습니까? 그렇게하면 코드가 어디에서나 작동한다는 것을 알고 있습니다.

당신은 아마 공개적으로나 개인적으로 구조물에서 수업을 도출 할 것입니다. 그런 다음 캐스트는 C ++ 코드에서 올바르게 해결됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top