2014-01-09 3 views
0

유니온은 사용자 정의 생성자가있는 클래스의 객체를 포함 할 수 있습니까? 내가 만들려고 할 때 그것은 "회원 'c :: aa'union 'c'의 사용자 정의 생성자 또는 비 단순한 기본 생성자가 있습니다."오류 메시지가 나타납니다. 표준 또는 내 코드에 오류가 있습니까?유니온은 사용자 정의 생성자가있는 클래스의 객체를 포함 할 수 있습니까?

내가 테스트 코드 ("구속되지 않은 조합")이 C++ 11 때문에 가능

class a 
{ 
public: 

    int aaa; 
    a(){} 

}; 

class b 
{ 

public : 

    long bbb; 
    b() { } 

}; 

union c 
{ 

public : 

    c() {} 

    a aa; 
    b bb; 
}; 

답변

2

C++ 11 이전의 대답은 "아니오"입니다. union은 값 형식 (관리 코드에서 용어를 빌려 오기), 즉 데이터 멤버 만 포함하는 형식 만 포함 할 수 있습니다.

Union은 모든 구성원에서 메모리 사용 공간을 공유합니다. 하나의 클래스의 데이터 멤버에 대해 작동하는 메서드가 유니온의 다른 클래스의 데이터 멤버를 clobber하는 상황이 발생합니다.

아마도 원하는 것은 struct입니다.

+0

답변 해 주셔서 감사합니다. 학습 목적으로 수업을 사용했습니다. 클래스 객체를 사용하는 것은 나쁜 습관입니까 아니면 충돌/모호한 동작으로 이어질 수있는 문제입니까? – GAP

+0

나는 그것을 나쁜 습관이라고 부르고 싶다. 명시 적으로 두 객체가 같은 메모리 공간을 공유하기를 원할 때만'union'을 사용하십시오.10 번 중 9 번, 거의 항상'struct'을 사용해야하며'union'을 사용해서는 안됩니다. –

+0

어떤 상황에서 객체의 메모리 내에'this'가 저장되어 있습니까? –

2

이다.

+0

[데모] (http://ideone.com/y7fRr0). –

+2

눈길을 끄는 코드의 또 다른 풍부한 소스. "기존 규칙 만 완화하기 때문에 코드를 위반하지 않습니다." 새로운 깨진 소프트웨어를 작성하는 것을 허용하는 한, 나는 그것을 할 것입니다. 템플릿 괴물에 대한 화려한 새로운 놀이터, 의심의 여지가 :). –

+0

@kuroi - 귀하의 의견을 이해할 수 없습니다. 물론 기존 코드를 손상시키지 않습니다. 왜 그랬을까요? 새로운 깨진 코드 작성이 허용된다고 생각하는 이유는 무엇입니까? – shawn1874

1
class a 
{ 
public: 

    int aaa; 
    a(){} 

}; 

class b 
{ 

public : 

    long bbb; 
    b() { } 

}; 

union c 
{ 

public : 

    c() {} 

    a aa; 
    b bb; 
}; 

int main() 
{ 
    return 0; 
} 

위의 코드는 다음 온라인 컴파일러를 사용하여 정상적으로 작동했습니다. http://www.compileonline.com/compile_cpp11_online.php

따라서 컴파일러에 따라 대답은 예와 아니오입니다. MS VS 2010은 아직 완전히 C++ 11이 아니기 때문에 해당 코드를 컴파일하지 않습니다. 분명히 최신 C++ 11 GCC 컴파일러가 잘 컴파일됩니다! 이는 사소한 사용자 정의 생성자가 데이터를 초기화하고 메모리 레이아웃을 변경하지 않기 때문에 마음에 듭니다.

C++ 03 표준은 사용자 정의 생성자가있는 모든 클래스 나 구조체가 POD가 아님을 명시합니다. Bjarn Stroustrup은 사용자 정의 함수가 항상 사소한 메모리 레이아웃을 유발하지 않기 때문에 POD와 비 POD의 정의가 너무 엄격하다는 것을 나타내는 그의 홈 페이지에 대해 뭔가를 썼습니다. 그것이 규칙이 완화 된 이유입니다.

관련 문제