2013-03-20 3 views
3

은의 다음 코드를 살펴 보자 :C++ 11 : 개인 회원 보안

#include <iostream> 
#include "mydemangled.hpp" 

using namespace std; 

struct A 
{ 
private: 
    struct B { 
     int get() const { return 5; } 
    }; 

public: 
    B get() const { return B(); } 
}; 

int main() 
{ 
    A a; 
    A::B b = a.get(); 

    cout << demangled(b) << endl; 
    cout << b.get() << endl; 
} 

그리고 컴파일러 (GCC 4.7.2)을 A::B이 비공개 말하는 악. 괜찮아. 그래서, 나는 코드 변경 :

int main() 
{ 
    A a; 

    cout << demangled(a.get()) << endl; 
    cout << a.get().get() << endl; 
} 

을하며 소리하지 않습니다

$ ./a.out 
A::B 
5 

의미, 나는 A::B의 인스턴스를 만들 수 없습니다,하지만 난 그것을 사용할 수 있습니다. 그래서 새 변경 (내 질문의 핵심).

int main() 
{ 
    A a; 
    auto b = a.get(); 

    cout << demangled(b) << endl; 
    cout << b.get() << endl; 
} 

그리고 출력 :

$ ./a.out 
A::B 
5 

문제가 A::B 개인 (따라서 그 생성자, 복사 생성자 등)되고, 여기에 무엇입니까?

+1

'private'은 보안 기능이 아닙니다. –

+0

외부에 대한 액세스/전시 보안 내 말은 –

+0

입니다. 흥미 롭습니다. 나는 여전히'auto'로 녹슨하다. 아마도'const A :: B &'가 될 것인가? 그것이'A :: B'가되면 개인 복사 생성자에 어떻게 접근합니까? –

답변

5

일반적으로 액세스 제어 이름이나 기호, 아니요 기본 엔티티. 수많은 회원이 있으며, 항상 존재 해왔다. 개인 회원에게 접근하는 방법; 당신이 할 수없는 일은 그러한 회원의 이름을 사용하는 것입니다.

예에서는 이름을 사용하지 않으므로 문제는 없습니다.

+0

이것을 더 잘 보시려면'A'의 공개 섹션에서'typedef B OtherB; '를 시도해보십시오. A :: OtherB는 메인에서 액세스 할 수 있으며'A :: OtherB'는 완벽하게 작동합니다. 이름 자체는 비공식적 인 것이고 유형 자체는 완벽하게 접근 할 수 있습니다. –