2013-05-04 3 views
0

몇 가지 수업이 있습니다. 하나의 클래스는 그것을 필요로하는 누구에게나 보여지기로되어 있고, 나머지 클래스들은 오직 주요 클래스에만 접근 할 수있는 도우미 클래스들 (물론 그 중 일부는 구조체들입니다)입니다. 나는 원래 이것을 교장 클래스 내에서 중첩 된 클래스로 구현했지만, 더 많은 헬퍼 클래스를 추가 할 때 헤더 파일을 복잡하게 만들기 시작했다. 이제는 헬퍼 클래스를 이름이 까다로운 별개의 네임 스페이스에 두었습니다. 그러나 더 나은 방법이 있다고 생각합니다. 익명의 네임 스페이스를 사용하고 싶습니다. 그러나 헤더에서 도우미 클래스를 가져올 수 없습니다. 왜냐하면 헤더의 멤버 변수로 표시되기 때문입니다.다른 나라의 도우미 클래스를 어떻게 숨겨야합니까?

여기 지금 내 헤더 파일의 구조의 단순화 된 버전입니다, 마이너스 경비 포함 :

namespace __TopSecretVisibleNamespace { 
    class Invisible{ 
    }; 
} 

using namespace __TopSecretVisibleNamespace; 
class Visible { 
    public: 
     Visible(); 
    private: 
     Invisible sneaky; 
}; 

어떤 생각을?

+3

일반적인 규칙은 '세부 사항'네임 스페이스입니다. '__T ... '는 구현을 위해 예약되어 있습니다 (밑줄 * 또는 *와 밑줄 뒤에 대문자가 오는 이름). –

+2

그래,'detail'. 그리고'네임 스페이스 디테일 사용하기 '를하지 마십시오. –

+0

Jerry - "구현을 위해 예약되어 있습니까?" 다른 네임 스페이스에 클래스를 선언 할 수 없지만 클래스를 선언 할 수는 없습니까? Cat - Ooh, 감사합니다. using 문이 헤더 파일 외부로 전달되지 않았다고 생각했습니다. –

답변

0

문자 그대로 '은폐 할 수는 없지만 protected 수정자를 사용하면 다른 클래스에서 액세스 할 수 없게 만들 수 있습니다. 어떤 이유로 든 모든 반원에게 보호를 사용하고 싶지 않다면, 그것을 구속 자에서만 사용할 수 있습니다. 이 경우 친구가 아닌 클래스는 공용 클래스를 포함하여 클래스의 모든 멤버에 액세스 할 수 없습니다.

class Invisible { 
    friend class Visible; 
    protected: 
    Invisible() { 
    } 
    public: 
    // though public, they cannot be called by classes other than Visible, because they can't instantiate the class. 
    int Calc(int n) 
    { 
     return n*n; 
    } 
    int i; 
}; 

class Visible { 
    public: 
    Visible(int i) 
    { 
     Invisible o; 
     x=o.Calc(i); 
    } 
    int x; 
}; 
관련 문제