이 미친 C ++ 11 구문 ==> struct : bar {} foo {} ;?


168

이것이 C ++ 11에서 무엇을 의미 할 수 있습니까?

struct : bar {} foo {};

흥미 롭습니다. 뭔가 유용하다고 생각하십니까? 강력한 유형의 (태그 유형) 단일 인스턴스를 생성하는 것이 속임수라고 생각합니다.
alfC

@alfC : 특별히 유용하지는 않습니다.
궤도에서

답변:


262

먼저 붐 표준 추상 UDT (User-Defined Type)를 사용합니다.

struct foo { virtual void f() = 0; }; // normal abstract type
foo obj;
// error: cannot declare variable 'obj' to be of abstract type 'foo'

UDT를 정의하는 동시에 UDT를 인스턴스화 할 수 있음을 기억하십시오.

struct foo { foo() { cout << "!"; } };          // just a definition

struct foo { foo() { cout << "!"; } } instance; // so much more
// Output: "!"

예제를 결합하고 이름없는 UDT를 정의 할 수 있음을 상기하십시오 .

struct { virtual void f() = 0; } instance; // unnamed abstract type
// error: cannot declare variable 'instance' to be of abstract type '<anonymous struct>'

익명 UDT에 대한 증거가 더 이상 필요하지 않으므로 순수한 가상 기능을 잃을 수 있습니다. 또한로 이름 instance을 바꾸면 foo다음과 같이 남습니다.

struct {} foo;

점점 가까이.


이 익명의 UDT가 어떤 기반에서 파생된다면 어떨까요?

struct bar {};       // base UDT
struct : bar {} foo; // anonymous derived UDT, and instance thereof

마지막으로, C ++ 11은 확장 된 초기자를 도입 하여 다음과 같은 혼란스러운 작업을 수행 할 수 있습니다.

int x{0};

이:

int x{};

그리고 마지막으로,

struct : bar {} foo {};

이것은 이름없는 구조체로 bar에서 파생되며 빈 이니셜 라이저로 foo로 인스턴스화됩니다.


11
프로그래밍 언어에 대한 부정적인 의견은 피해야한다는 것을 알고 있으며, 여기서는 약간 벗어난 주제 일 수 있습니다. 그러나 C ++ 0x가 C ++보다 더 복잡한 언어가되는 이유를 이해하지 못합니다. 누가 그걸 원해? 점점 더 암호가 된 프로그래밍 언어의 장점은 무엇입니까? 이 선언은 IMHO의 또 다른 예입니다. 저는 수년 동안 C ++을 사용해 왔지만 여전히이 언어를 익히기가 어렵습니다.
Giorgio

26
@Giorgio : 왜 이것이 문제입니까? 정확히 무엇을 두려워합니까? 설명 된 구성은 언어에서 허용되는 핵심 사례이며 핵심 개념에서 자연스럽게 따르며 아무런 문제가 없습니다. 또한 매우 제한적인 유틸리티입니다. 당신은 그것을 사용할 필요가 없습니다. 그러나 구문 상 논리적이며 어떤 것도 충돌하거나 충돌하지 않습니다. 그렇다면 이것이 왜 언어, 특히 예외적으로 잘 디자인 된 언어 대한 논쟁 일까요?
Kerrek SB

13
@Giorgio-멋진 부분은 상황이 정확히 반대라는 것입니다. c ++ 0x는 비밀 스럽거나 추악하지 않은 많은 강력한 기능을 추가하고 있습니다. 당신은 비밀을 원하십니까? -Perl을 확인하십시오. 이 예제는 암호의 제목에 거의 접근하지 않습니다.
Gene Bushuyev

18
@ Kerrek SB C ++ (현재 C ++ 0x)에는 너무 많은 개념이 있으며 구문과 의미를 배우는 것이 어렵다고 생각합니다. 각 프로그래머 (나는 그들 중 하나입니다)는 동일한 일을하는 데 너무 많은 다른 방법이 있기 때문에 언어의 하위 집합을 사용하게됩니다. C ++이 잘 설계되어 있다고 생각하지 않습니다. 많은 임시 기능이 있으며 강력한 모듈 (가져 오기 / 내보내기) 메커니즘과 같은 특정 기본 사항이 누락되었습니다 (여전히 C의 오래된 #include를 사용함). C ++ 0x 노력은 C ++가 아니라 더 작고 사용하기 쉽게 만드는 것을 목표로해야한다고 생각합니다.
Giorgio

31
@Giorgio : 솔직히 말하면, 그러한 노력은 C ++을 처음부터 다시 빌드해야합니다. 작성하는 새로운 언어를 만드는 데 입니다. 그리고 그 했다 ... 여러 번 완료되었습니다.
궤도에서 가벼움 경주

106

이것은 다음을 정의합니다.

  • 익명의 구조체
  • 이것은 공개적으로 파생 된 bar
  • 어느 ( anonymously)는 다른 것을 정의하지 않습니다.bar
  • 마지막으로 "foo"라는 인스턴스가 생성됩니다.
  • 빈 이니셜 라이저 목록

struct : bar {} foo {};
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.