불투명 포인터
Opaque pointer컴퓨터 프로그래밍에서 불투명 포인터는 불투명한 데이터 타입의 특수한 경우로, 불특정 유형의 레코드 또는 데이터 구조에 대한 포인터로 선언된 데이터 타입입니다.
불투명 포인터는 Ada, C, C++, D 및 Modula-2를 포함한 여러 프로그래밍 언어로 존재합니다.
언어가 강하게 입력된 경우 불투명 포인터 유형 T에 대한 다른 정보가 없는 프로그램 및 프로시저는 여전히 유형 T의 변수, 배열 및 레코드 필드를 선언하고 해당 유형의 값을 할당하여 이들 값을 비교할 수 있습니다.그러나 이러한 포인터를 참조 해제할 수 없으며 누락된 정보가 있는 일부 프로시저를 호출하는 것만으로 오브젝트의 내용을 변경할 수 있습니다.
불투명 포인터는 인터페이스의 구현 세부사항을 일반 클라이언트로부터 숨기는 방법으로, 이를 사용하여 모듈을 재컴파일할 필요 없이 구현을 변경할 수 있습니다.간단한 인터페이스를 만들 수 있고 대부분의 세부사항을 다른 파일에 [1]숨길 수 있기 때문에 프로그래머에게도 유용합니다.예를 들어 공유 라이브러리의 다른 버전을 통해 바이너리 코드 호환성을 제공하는 데 중요합니다.
이 기술은 설계 패턴에서 브리지 패턴으로 설명되어 있습니다.특히 C++[2] 커뮤니티에서는 "handle class",[2] "Pimpl idiod",[3] "compiler firewall idiod",[4] "d-pointer" 또는 "Cheshire Cat"으로 불리기도 합니다.
예
아다
패키지 라이브러리_인터페이스 이 유형 핸들 이 한정된 사적인; -- 조작... 사적인 유형 숨김_실장; -- 패키지 본문에 정의되어 있습니다. 유형 핸들 이 접근 숨김_실장; 끝. 라이브러리_인터페이스; 종류Handle는 사양에 정의되어 있지 않은 실제 실장에 대한 불투명한 포인터입니다.타입은 프라이빗할 뿐만 아니라(클라이언트가 직접 타입에 액세스 하는 것을 금지하고, 조작에 의해서만), 한정되어 있는 것에 주의해 주세요(데이터 구조의 카피를 회피해, 참조가 행업 하는 것을 방지합니다).
패키지 몸 라이브러리_인터페이스 이 유형 숨김_실장 이 기록. ... --실제 실장은 어떤 것이든 가능합니다. 종료 레코드; -- 조작의 정의... 끝. 라이브러리_인터페이스; 이러한 유형은 Ada 95의 주요 설계자인 Tucker Taft의 이름을 따서 "태프트 유형"이라고 불리기도 하는데, 이는 소위 Ada [5]83의 태프트 수정안에 도입되었기 때문이다.
C
/* obj.h */ 구조 obj; /* * 컴파일러는 구조 obj를 불완전한 유형으로 간주합니다.불완전한 유형 *는 선언에 사용할 수 있습니다. */ size_t obj_size(무효); 무효 obj_setid(구조 obj *, 인트); 인트 obj_getid(구조 obj *); /* obj.c */ #실패하다 "obj.h" 구조 obj { 인트 아이디; }; /* * 발신자가 할당을 처리합니다. * 필요한 정보만 제공 */ size_t obj_size(무효) { 돌아가다 크기(구조 obj); } 무효 obj_setid(구조 obj *o, 인트 i) { o->아이디 = i; } 인트 obj_getid(구조 obj *o) { 돌아가다 o->아이디; } 이 예에서는 C 언어를 사용하여 객체 지향 프로그래밍의 정보 숨기기(캡슐화) 측면을 실현하는 방법을 보여 줍니다.만약 누군가가 정의를 바꾸고 싶다면struct obj, 프로그램 내의 다른 모듈을 재컴파일할 필요가 없습니다.obj.hheader 파일(API도 변경되지 않은 경우)을 지정합니다.함수는 전달된 포인터가 다음과 같이 되어 있지 않은지 확인하는 것이 바람직할 수 있습니다.NULL단, 상기 체크는 간결성을 위해 생략되어 있습니다.
C++
/* Public Class.h */ #실패하다 <메모리> 학급 퍼블릭 클래스 { 일반의: 퍼블릭 클래스(); // 컨스트럭터 퍼블릭 클래스(컨스턴트 퍼블릭 클래스&); // 생성자 복사 퍼블릭 클래스(퍼블릭 클래스& &); // 생성자 이동 퍼블릭 클래스& 교환입니다.=(컨스턴트 퍼블릭 클래스&); // 할당 연산자 복사 퍼블릭 클래스& 교환입니다.=(퍼블릭 클래스& &); // 할당 연산자 이동 ~퍼블릭 클래스(); // 파괴자 // 기타 작업... 사적인: 구조 체셔캣; // 여기서 정의되지 않음 표준::unique_ptr< >체셔캣> d_ptr_; // 불투명 포인터 }; /* Public Class.cpp */ #실패하다 「퍼블릭 클래스.h" 구조 퍼블릭 클래스::체셔캣 { 인트 a; 인트 b; }; 퍼블릭 클래스::퍼블릭 클래스() : d_ptr_(표준::make_filengths< >체셔캣>()) { // 아무것도 하지 마세요. } 퍼블릭 클래스::퍼블릭 클래스(컨스턴트 퍼블릭 클래스& 다른.) : d_ptr_(표준::make_filengths< >체셔캣>(*다른..d_ptr_)) { // 아무것도 하지 마세요. } 퍼블릭 클래스::퍼블릭 클래스(퍼블릭 클래스& & 다른.) = 체납; 퍼블릭 클래스& 퍼블릭 클래스::교환입니다.=(컨스턴트 퍼블릭 클래스 &다른.) { *d_ptr_ = *다른..d_ptr_; 돌아가다 *이것.; } 퍼블릭 클래스& 퍼블릭 클래스::교환입니다.=(퍼블릭 클래스& &) = 체납; 퍼블릭 클래스::~퍼블릭 클래스() = 체납; d-pointer 패턴은 불투명 포인터의 구현 중 하나입니다.C++ 클래스에서 일반적으로 사용되는 이유는 그 이점 때문입니다(아래 참조).d-pointer는 구조체의 인스턴스를 가리키는 클래스의 개인 데이터 멤버입니다.이 메서드를 사용하면 클래스 선언에서 d-pointer [6]자체를 제외하고 개인 데이터 멤버를 생략할 수 있습니다.결과적으로.
- 클래스 구현의 더 많은 부분이 숨겨져 있다
- 개인 구조에 새 데이터 멤버 추가는 이진 호환성에 영향을 주지 않습니다.
- 클래스 선언을 포함하는 헤더 파일은 클래스 인터페이스에 필요한 파일만 포함하면 됩니다.실장에는 포함되지 않습니다.
한 가지 이점은 헤더 파일의 변경 빈도가 적기 때문에 컴파일 속도가 빨라진다는 것입니다.d-pointer 패턴의 가능한 단점은 포인터를 통한 간접적인 멤버접근(예를 들어 동적 스토리지 내의 오브젝트에 대한 포인터)입니다.이는 보통 포인터가 아닌 멤버에 대한 접근보다 느릴 수 있습니다.d포인터는 Qt[7] 및 KDE 라이브러리에서 많이 사용됩니다.
「 」를 참조해 주세요.
레퍼런스
- ^ Chris McKillop. "Programming Tools — Opaque Pointers". QNX Software Systems. Retrieved 2019-01-16.
- ^ a b Bruce Eckel (2000). "Chapter 5: Hiding the Implementation". Thinking in C++, Volume 1: Introduction to Standard C++ (2nd ed.). Prentice Hall. ISBN 0-13-979809-9.
- ^ Vladimir Batov (2008-01-25). "Making Pimpl Easy". Dr. Dobb's Journal. Retrieved 2008-05-07.
- ^ 허브 서터.Pimpls의 즐거움(또는 컴파일러 방화벽 이디옴에 대한 자세한 내용)
- ^ Robert A. Duff (2002-07-29). "Re: What's its name again?". Newsgroup: comp.lang.ada. Retrieved 2007-10-11.
- ^ d-포인터 사용 - KDE에서 불투명 포인터를 구현하는 이유와 방법
- ^ "D-Pointer". Qt wiki. Retrieved 23 Dec 2016.