2010-01-17 7 views
26

헤더 파일의 네임 스페이스에 포함 된 인라인 함수가 있으며 현재이 파일을 cpp 파일로 옮길 수 없습니다. 이러한 인라인 기능 중 일부는 예를 들어, 마법 상수를 사용인라인 네임 스페이스 헤더의 전용 상수 숨기기

// Foo.h 
namespace Foo 
{ 
    const int BAR = 1234; 

    inline void someFunc() 
    { 
     // Do something with BAR 
    } 
} 

그러나, 나는이 마법 상수를 비공개 할 - 모든 아이디어를 어떻게?

// Foo.h 
namespace Foo 
{ 
    namespace 
    { 
     // 'private' constants here 
     const int BAR = 1234; 
    } 

    inline void someFunc() 
    { 
     // Do something with BAR 
    } 
} 

그러나,이 작동하지 않고 Foo::BARFoo.h가 포함되어있는 CPP 파일에 사용할 수있는 나의 첫번째 생각은 따라서 익명의 네임 스페이스를 사용했다? 구현 cpp 파일을 만들지 않고이 작업을 수행 할 수있는 방법이 있습니까?

답변

28

익명 네임 스페이스는 정의 된 변환 단위 (또는 사용자의 경우 포함됨)에서 작동하지 않습니다.

namespace foo { 
    namespace detail { 
     int magic = 42; 
    } 

    // ... use detail::magic 
} 
+4

이것은 또한 대회 부스트 사용법입니다. 어쨌든 대부분의 경우 수행하지 않을 단순한 "세부 네임 스페이스 입력 안 함"이라고 모두 알려주는 한 잘 작동합니다. – GManNickG

3

특별한 네임 스페이스에 넣어 또는 특별히 그 이름을 프로젝트 규칙과 함께 같은 일이 아닌 것을 :
당신은 내부 세부 사항 인 사용자에게 표시하기 위해 detail 네임 스페이스로 이동 고려할 수 -public :

namespace foo { 
    namespace detail { // as in "implementation details" 
    inline int answer() { return 42; } 
    const int perfect = 28; 
    } 
    std::string _question(); // not part of foo's "public interface" by convention 

    int this_is_public() { 
    using namespace detail; // now don't have to prefix detail:: 
    return answer() + perfect + _question().length(); 
    } 
} 

비공개로 기록 된 이름을 사용하는 사람은 사용자가 시도하는 "보호"를 피할 수 있습니다. 진정한 관심사를 강조합니다. 공개 인터페이스의 일부를 문서화하고 의존 할 수 있습니다.

이름 공간은 다른 문제를 해결합니다. 이름을 특정 TU에만 부여하는 것입니다. 그들은 여기서 도움을주지 않을 것입니다.

namespace Foo { 
    class foo_detail { 
    private: 
     enum { 
      BAR = 1234, 
     }; 

     friend void someFunc(); 
    }; 

    inline 
    void someFunc() { 
     // something with foo_detail::BAR 
    } 
} 

이 친구로 표시하는 기능보다는 다른 사람에 대한 상수 nonaccessible한다 :에 대해 어떻게

16

. 누구도 클래스를 인스턴스화하지 않도록 생성자를 비공개로 만들어 클래스를 비 구조화 할 수 있습니다.