프렌드 클래스
Friend classC++의 친구 클래스는 친구로 [1]선언된 클래스의 개인 및 보호된 멤버에 액세스할 수 있습니다.friend 클래스의 중요한 용도는 클래스로 표현되는 데이터 구조의 일부에 대해 해당 데이터 구조를 나타내는 메인 클래스에 대한 액세스를 제공하는 것입니다.Friend Class 메커니즘을 사용하면 데이터 구조 사용자가 볼 수 있는 적절한 캡슐화를 유지하면서 스토리지와 부품에 대한 액세스를 확장할 수 있습니다.
친구 클래스와 마찬가지로 친구 함수는 친구로 선언된 클래스의 비공개 및 보호 멤버에 대한 액세스 권한이 주어지는 함수입니다.
예
다음 예제에서는 그래프 데이터 구조에 친구 클래스를 사용하는 방법을 보여 줍니다. 여기서 그래프는 주 클래스 그래프로 표시되고 그래프의 정점은 클래스 정점으로 표시됩니다.
#실패하다 <iostream> #실패하다 <메모리> #실패하다 <문자열> #실패하다 <unordered_set> 학급 그래프; 학급 꼭지점 { 일반의: 명시적 꼭지점(표준::스트링 이름.) : 가장자리_(), 이름_(표준::움직이다(이름.)) {} 자동 시작한다.() 컨스턴트 { 돌아가다 가장자리_.cbegin(); } 자동 끝.() 컨스턴트 { 돌아가다 가장자리_.센드(); } 컨스턴트 자동& 이름.() 컨스턴트 { 돌아가다 이름_; } 사적인: // 정점은 Graph에 대한 액세스 권한을 제공합니다. 친구. 학급 그래프; 표준::unordered_set(미정)< >꼭지점*> 가장자리_; 표준::스트링 이름_; }; 학급 그래프 { 일반의: ~그래프() { 하는 동안에 (!꼭지점_.빈()) { 자동 꼭지점 = 꼭지점_.시작한다.(); 버텍스 제거(*꼭지점); } } 자동 애드버텍스(컨스턴트 표준::스트링& 이름.) -> 꼭지점* { 자동 꼭지점 = 표준::make_filengths< >꼭지점>(이름.); 자동 반복하다 = 꼭지점_.삽입하다(꼭지점.얻다()); 돌아가다 꼭지점.풀어주다(); } 무효 버텍스 제거(꼭지점* 꼭지점) { 꼭지점_.지우다(꼭지점); 삭제하다 꼭지점; } 자동 애드 엣지(꼭지점* 부터, 꼭지점* 로.) { // 정점이 그래프로 선언했기 때문에 그래프는 정점의 개인 필드에 액세스할 수 있습니다. // 친구. 부터->가장자리_.삽입하다(로.); } 자동 시작한다.() 컨스턴트 { 돌아가다 꼭지점_.cbegin(); } 자동 끝.() 컨스턴트 { 돌아가다 꼭지점_.센드(); } 사적인: 표준::unordered_set(미정)< >꼭지점*> 꼭지점_; }; 캡슐화
friend 클래스를 적절하게 사용하면 캡슐화가 증가합니다.이는 다른 외부 클래스에 대한 개인 액세스를 허용하지 않고 데이터 구조의 개인 액세스를 데이터 구조가 소유하는 부분으로 확장할 수 있기 때문입니다.이렇게 하면 데이터 구조가 외부로부터 데이터 구조의 불변성을 깨려는 우발적인 시도로부터 보호됩니다.
클래스는 다른 클래스의 개인 부분에 대한 액세스를 스스로 부여할 수 없으며, 이로 인해 캡슐화가 중단됩니다.오히려 클래스는 해당 클래스를 친구로 선언함으로써 다른 클래스에 자신의 개인 부분에 대한 액세스 권한을 부여합니다.그래프 예제에서 그래프는 자신을 친구 정점으로 선언할 수 없습니다.오히려 정점은 Graph를 친구로 선언하므로 Graph는 전용 필드에 액세스할 수 있습니다.
학급이 자신의 친구를 고른다는 것은 우정이 일반적으로 대칭적이지 않다는 것을 의미한다.그래프 예제에서 그래프는 정점의 개인 필드에 액세스할 수 있지만 정점은 그래프의 개인 필드에 액세스할 수 없습니다.
대체 수단
C#의 internal 키워드에 의해 유사하지만 동등하지는 않은 언어 기능이 제공되므로 동일한 어셈블리 내의 클래스가 다른 클래스의 프라이빗 부분에 액세스할 수 있습니다.이는 각 클래스를 같은 어셈블리에서 다른 클래스의 친구로 표시하는 것에 해당합니다.친구 클래스는 보다 세밀합니다.
친구 클래스 또는 유사한 언어 기능을 지원하지 않는 프로그래밍 언어는 데이터 구조에 대한 안전한 부품 기반 인터페이스를 구현하기 위해 회피책을 구현해야 합니다.이러한 회피책의 예는 다음과 같습니다.
- 부품의 필드를 공개합니다.이 솔루션은 외부에서 데이터 구조의 불변성을 위반할 수 있도록 함으로써 캡슐화를 줄입니다.
- 모든 가변 구조 데이터를 부품에서 데이터 구조로 이동하고 각 부품에서 해당 데이터 구조로 다시 리디렉션합니다.이 솔루션은 데이터 구조의 구성을 변경하여 이 정보가 필요하지 않은 경우에 메모리 소비를 증가시킵니다.
특성.
- 우정은 대칭적이지 않다(클래스일 경우).
A수업의 친구다B,학급B자동적으로 수업의 친구가 되는 것은 아니다.A. - 우정은 일시적인 것이 아니다(클래스일 경우).
A수업의 친구다B, 및 클래스B수업의 친구다C,학급A자동적으로 수업의 친구가 되는 것은 아니다.C. - 우정은 계승되지 않는다(클래스인 경우).
Base수업의 친구다X, 서브클래스Derived자동적으로 수업의 친구가 되는 것은 아니다.X; 및 if 클래스X수업의 친구다Base,학급X자동적으로 서브클래스의 친구가 되는 것은 아닙니다.Derived단, 수업의 경우Y서브클래스의 친구입니다.Derived,학급Y또한 클래스의 보호된 부분에 액세스할 수 있습니다.Base서브클래스와 마찬가지로Derived한다.