2009-11-22 3 views
0

나는 이런 식으로 뭔가있는 pImpl 관용구에 대한 몇 가지 물건을 읽는 동안 :이상한 "형 클래스 :: 방법() : 물건"구문 C++

MyClass::MyClass() : pimpl_(new MyClassImp())

먼저 : 그것은 무엇을 의미 하는가를?
둘째 : 구문은 무엇입니까?
그런 멍청한 녀석 인 것에 대해 유감스럽게 생각합니다.

+3

생성자 초기화 목록은 C++ 언어의 기본 기능입니다. 그것은 당신이 당신의 기본 C++ 책에서 읽은 것입니다. – AnT

+0

미안하지만, C++을 처음 접했을 때, 저는 C 세상에서 왔습니다. 나는 Obj-C와 Delphi에서 OOP에 익숙하지만 C++에 특화되어있다. –

+0

그런 다음 C++에 대한 기본적인 소개를 읽어보십시오. Andrey가 말했듯이 이것은 매우 기본적인 지식입니다. 기본적인 소개 없이는 언어를 효과적으로 배울 수 없습니다. – sbi

답변

8

MyClass에 대한 생성자를 정의합니다.

구문은 an initialization list 인 생성자 정의의 구문입니다 (생성자 본문을 정의하는이 다음에 중괄호가 있다고 가정합니다).

pimpl_MyClass 인 새 오브젝트에 대한 포인터로 초기화되고 있습니다 (MyClassImp). 다음과 거의 같습니다 :

그러나 가능하면 클래스 이름을 초기화하기 위해 초기화 목록을 사용하는 것이 좋습니다. 위에 링크 된 C++ FAQ Lite 항목을 참조하십시오.

+0

빠른 답변을 보내 주셔서 감사합니다! 그것은 물건을 깨끗하게했다! 그리고이 FAQ Lite를 검색했습니다 ... –

+0

+1 좋은 대답 – Klaim

2

초기화 목록입니다. 생성자 코드가 호출되기 전에 멤버 및 기본 클래스 생성자의 값을 설정할 수 있습니다.

클래스 인스턴스의 값을 초기화하는 데 사용해야합니다.

0

초기화리스트가있는 생성자가되는 것 외에도 이미 설명 된 다른 초기화 메소드와 마찬가지로 개인 구현 패턴을 사용합니다.

C++에서는 클래스의 모든 공개 및 비공개 멤버를 포함하도록 클래스 선언이 필요합니다. 이로 인해 원하지 않는 구현 세부 사항을 노출하고 구현을 API/ABI에 포함시킬 수 있습니다. 또한 공용 헤더에서 private 멤버 변수를 지원하기 위해 #을 추가하여 컴파일 시간을 크게 늘릴 수 있습니다.

실제로 구현 된 두 번째 클래스를 작성하고 기능적 API 만 노출하면 훨씬 더 깔끔하고 간접적 인 추가 계층이 필요합니다.

C는 일반적으로 라이브러리가 만들고 파괴하는 불투명 한 객체에 대한 포인터를 가짐으로써 이것을 처리합니다.