2010-12-17 18 views
1

이의 내가 헤더 파일 Snake.h 있다고 가정 해 봅시다 :네임 스페이스 ++

#include "SnakeBodyPart.h" 
#include "GUI.h" 
//... 

을 그리고 SnakeBodyPart.h은 (무엇보다도)입니다 :

#include "GUI.h" 
class SnakeBodyPart { 
    private : 
     GUI::Orientation orientation; 
} 

그리고 마지막으로 GUI에서

. 시간 : Snake.cpp에서 지금

class GUI { 
    enum Orientation { NORTH, EAST, SOUTH, WEST }; 
} 

난 다음을 수행 할 :

void Snake::turn(){ 
    if(bodyPart.getOrientation() == GUI::EAST){ 
     //do something 
    else if (bodyPart.getOrientation() == GUI::SOUTH){ 
     //do something 
    else if ... 
} 

당신이 요점을 얻는다고 생각합니다. 내가 알고 싶은 것은 : 단일 메서드에 대한 네임 스페이스를 설정할 수 있습니까? 네임 스페이스 GUI를 Snake::turn에주는 것과 마찬가지로 bodyPart.getOrientation() == EAST을 입력하면됩니까?

Snake.cpp에 다른 네임 스페이스가있는 enum이 몇 개 있는데 특정 메서드에 특정 네임 스페이스를 지정하여 코드를 더 읽기 쉽게 만들고 싶습니다. 네임 스페이스 (Snake.cpp 용)이 아닙니다. 이것이 가능한가?

+0

왜 "GUI.h"를 두 번 snake.h와 SnakeBodyPart.h에 포함합니까? 정적 함수 여야하고, 그렇지 않으면 객체를 인스턴스화하여 호출해야합니다. 왜 네임 스페이스인지, 정적 함수를 사용하십시오. 클래스 함수가 ​​아닌 네임 스페이스에 모든 enum을 모으십시오. – DumbCoder

+0

당신의 대답은 나에게 전혀 의미가 없습니다. – Aerus

+1

else-if 체인을 피하기 위해 (bodyPart.getOrientation())을 전환 할 수 있습니다. –

답변

3

예제에서 GUI은 네임 스페이스가 아니라 클래스입니다.

turn() 안에는 using namespace GUI;을 써서 명시 적으로 한정하지 않고 GUI 네임 스페이스의 모든 식별자에 액세스 할 수 있습니다. 또는 예를 들어 단일 심볼을 가져올 수 있습니다. 너무 using GUI::EAST; : GUI 이후

void Snake::turn(){ 
    using namespace GUI; 
    if(bodyPart.getOrientation() == EAST){ 
     //do something 
    else if (bodyPart.getOrientation() == SOUTH){ 
     //do something 
    else if ... 
} 
+0

흠 .. 나는 혼란스러워해야만한다. 나는 모든 클래스가 자신의 네임 스페이스를 가지고 있다고 생각했다. GUI는 실제로 클래스입니다. 어떻게 그렇게할까요? (GUI :: EAST를 작성하지 않고 그냥 EAST를 작성하십시오.) – Aerus

+0

@Aerus : 예, 개념적으로 클래스는 포함 된 모든 구성원을위한 새로운 이름 공간입니다.그러나 C++의 네임 스페이스 (namespace) 구조에 대해 이야기하고있었습니다. 당신이 C++'네임 스페이스'에 열거 형을 가지고 있다면'using' 문을 사용할 수있었습니다. 'GUI'를 클래스로 만드는 것을 고려해보십시오 (모든 흥미로운 enum과 상수를 포함하는 것과 같은 네임 스페이스를 갖는 것은 꽤 일반적입니다). –

+0

아아 알 겠어. 마지막 문장에서 'GUI'를 * 네임 스페이스 *로 만들 것을 고려 했습니까? 지금부터, 그것은 * 클래스입니다. 나는 이것을하려고 노력할 것이다. 그러나 이것은 과제의 일부이고, 우리는 주어진 헤더 파일을 변경할 수 없다. 그래서 나는 프로젝트를 완전히 마친 후에 이것을 시도 할 것이다. (빌어 먹을 기억 누출로 인해 나를 지키지 못하게) – Aerus

1

은 명확하고 명시 적 그래서 코드를 읽는 모든 사람들이 무슨 일이 일어나고 있는지의 맥락을 알고 GUI::을 입력 클래스입니다. 약간의 추가 타이핑으로 코드를 한 번만 작성해야하지만 사람들은 수년간 코드를 읽어야 할 수도 있습니다.

편집 : GUI가하는 경우 또는, (enum 유일의) 클래스가 될 네임 스페이스로 변경하고 기능에 using namespace GUI;을 할 필요하지 .

+0

그래, 내 코드를 읽어야하는 사람들을 잊어 버렸다. 나는 그 앞에'GUI :: :: '라고 남겨 두겠다. 네임 스페이스로 만들려면 Frerich Raabe의 대답에 대한 필자의 편집 내용을 읽으십시오. – Aerus

1

네가 원하는 것은 사람이 읽을 수있는 짧은 코드이고 네임 스페이스가 만든 실제 해상도가 아닌 경우 원하는 결과를 얻기 위해 typedef 또는 매크로를 사용할 수 있습니다.

명명 규칙 충돌을 염려하지 않으면 헤더가 Orientation 변수를 만들거나 열거 형의 방향 멤버를 참조 할 수있을만큼 충분하지 않을 경우 클래스 또는 네임 스페이스 내에 열거 형을 포함 할 필요가 없습니다 직접.