2016-12-13 4 views
1

내 교수가 유니에서 우리에게 말했던 것과 Stroustrup의 책에서 읽은 것 사이에 약간의 혼동이있었습니다.C++ 헤더와 네임 스페이스

  • 우리 모두는 C++ header의 (a file.h에 정의) 선언의 모음이 기본적으로 알고 그들은 예를 들어 클래스 모음을 포함 할 수 있습니다. 그들이 우리에게 하나의 공간에 저장 기능 많이 제공하기 때문에 그들은 매우 유용

  • 네임 스페이스는 정의하지 않고 프로그램의 일부 클래스, 함수, 유형 (...)를 구성하는 발명가 someting입니다 유형.

프로젝트를 만들 때 구체적인 차이점을 볼 수 없습니다. 내가 가진 경우


다양한 수준의 방정식을 해결하는 프로그램을 만들기 위해 (예를 들어), 나는 하나의 파일에 필요한 클래스를 넣어 것입니다. 예를 들어, 나는이 모든 것들을 equations.h에 넣을 것이다 : 클래스 secondDeg, 클래스 thirdDeg, 클래스 fourthDeg 등등.

왜 네임 스페이스를 사용해야합니까?

더 나은 조직 (std :: cin 참고)에 이름을 부여 할 수 있기 때문에 답은있을 것입니다. 그러나이 경우 나는

  1. 만들기해야 equations.h (또는 무엇이든)
  2. 네임 스페이스

이 정말 necassary가 내 수업을 넣어 예를

  • 에 대한 eq라는 네임 스페이스를 만드시겠습니까? 헤더 파일 만 사용하고 모든 클래스를 안에 넣을 수 없습니까?

  • 답변

    3

    뚜렷한 개념이 두 개있는 것 같습니다. 헤더는 일반적으로 선언을 포함하는 데 사용되는 파일입니다. 함수 선언, 클래스, 템플릿 등을 포함 할 수 있습니다.

    선언 된 모든 항목이 고유 한 범위를 정의하는 수단입니다. 따라서 표준의 이름과 충돌 할 수있는 함수 및 클래스 이름을 사용할 수 있습니다. 예 :

    namespace mystuff 
    { 
        class list { }; 
    }; 
    

    목록이 std :: list와 충돌하지 않습니다.

    네임 스페이스 및 이어야하며 그 네임 스페이스의 일부인 클래스를 선언하기 위해 헤더 파일에 사용되어야합니다. 그러나 다른 사람들이 언급했듯이 헤더 파일에서 'using'지시문을 사용하는 것은 이름 공간이 해결하려고했던 바로 그 이름 충돌을 만들 수 있으므로 권장하지 않습니다.

    +0

    이 ispira 정확히 내가 필요한 답변, 난 정말 차이가 있어요. 예제에서 표준 라이브러리에 문제가없는 mystuff :: list를 호출 할 수 있습니다. 고맙습니다! –

    6

    정말 대단한가요?

    에 달려 있습니다. 더 좋고 더 명확한 옵션은 신고서를 namespace에 삽입하는 것입니다.

    헤더 파일 만 사용하고 모든 클래스를 내부에 넣을 수는 없습니까?

    물론 당신은 바로 글로벌 (::) 범위에서 선언 기호 어떤 충돌을 방지하고 헤더 파일에 using namespace <xxx>; 자제 할 수 있습니다.

    +0

    그래서 네임 스페이스는 자바 패키지와 비슷합니까? –

    +0

    @RaffaeleRossi 어쨌든, 그렇습니다. –

    +0

    좋습니다. 도움이되었습니다. 알아 냈습니다. 전역 범위의 심볼과의 충돌을 피하기 위해 헤더에 네임 스페이스를 사용하지 않는 것이 좋습니다. –

    7

    왜 네임 스페이스를 사용해야합니까?

    네임 스페이스는 여러 헤더를 포함 할 수 예., namespace std<vector><list>에서 정의를 포함 등

    당신은 당신의 자신의 namespace 글로벌 네임 스페이스를 오염시키고 피할 수있는 충돌을 정의 할 수 있습니다.네임 스페이스를 최소한으로 제한하는 것이 좋습니다. 그러므로 using namespace std;은 일반적으로 피해야합니다.