2012-07-17 2 views
8

저는 C++을 처음 사용합니다. 나는 몇몇 일원에게서 다량 일원을 아주 빈번하게 읽는가?.C++의 변형 멤버는 무엇입니까?

class School 
{ 
    int x; -> data member. 
} 

데이터 회원을 알고 있습니다. 변종 회원은 무엇입니까?

참고 : C++ 사양에서 : 생성자 페이지 아래.

X is a union-like class that has a variant member with a non-trivial default constructor. 
+6

이 사이트에 링크를 게시 할 수 있습니까? – Praetorian

+0

스택 오버플로 자체가 그 중 하나입니다. – BlackVegetable

+0

당신은'boost :: variant' 또는 무엇인가에 대해 이야기하고 있습니까? 전통적으로 변형은 지원되는 모든 유형이 포함 된 공용체입니다. – chris

답변

11

"변형 부재는"C++ 11 9.5/8로 정의된다

노조 같은 클래스 조합 또는 직접 구성원으로 익명 조합 되어있는 클래스이다. 유니온과 같은 클래스 X에는 변형 멤버 집합이 있습니다. X가 공용체 인 경우 변형 멤버는 비 정적 데이터 멤버입니다. 그렇지 않으면, 그것의 변형 회원 즉 X.

의 회원, 노동 조합의 모든 비 정적 데이터 멤버가 "변종 회원은"있는 모든 익명 조합의 비 정적 데이터 멤버입니다, 임의의 익명화 된 공용체를 포함하는 클래스의 경우 비 정적 데이터 멤버는 클래스의 "변형 멤버"입니다.

따옴표로 묶인 컨텍스트는 12.1/5이며, 공용체와 같은 클래스에 변형되지 않은 기본 생성자가있는 변형 멤버가 있으면 클래스 자체의 기본 생성자가 삭제된다는 내용입니다. 문제는 입니다. 변형 멤버는 클래스의 기본 생성자에서 생성해야하며 솔루션에는 기본 생성자가 없어야합니다. 모든 변형 멤버가 간단한 기본 생성자를 가지면 아무런 문제가 없으므로 클래스의 기본 생성자는 모두를 구성하거나 아무 것도 생성하지 않으므로 아무런 문제가 없습니다.

boost::variant은 별개입니다. "일부 사이트"가 "변형 멤버"라고 말하면 "이 가질 수있는 가능한 유형"즉, 해당 variant의 "멤버"를 의미 할 때 너무 놀랍지 않을 것입니다. 그러나 이것은 C++ 11 표준에서 새로 정의 된 의미가 아닙니다.

+0

스티브, 답장을 보내 주셔서 감사합니다. 귀하의 의견에서 더 명확하게하기 위해 노력하고 있습니다. 그래서 union {int x; int y},이 경우 x, y는 모두 변형 멤버입니다. 나 맞아? – Whoami

+0

@Whoami : 맞습니다. –

7

용어 변이체는 일반적으로 다른 유형의 집합의 값을 보유 할 수있는 부재를 식별하기 위해 사용된다. 언어의 union과 유사하게 variant이라는 용어는 일반적으로 유형이 안전한 방식으로 다양한 옵션을 저장할 수있는 유형을 위해 예약되어 있습니다.

부스트 변형 라이브러리의 설명서를 읽고 그러한 개념을 명확히하지 않으면 의견을 남기거나 의심스러운 질문을 만들 수 있습니다.

Boost Variant

2

변종 연합 부재가 현재 사용되고있는 기술 조합원와 부호없는 정수 부재를 포함하는 구조이다. 노조가 무엇인지 모르는 경우에는 먼저 그것에 대해 읽은 다음 다시 방문하십시오.