2013-01-14 3 views
2

저는 게임 프레임 워크를 작성하고 있습니다. 렌더러와 같은 플랫폼 종속 코드를 일반화하고 캡슐화하여 좀 더 쉽게 포팅 할 수 있도록 노력하고 있습니다. 여전히 프레임 워크를 사용하는 깨끗한 방법을 가지고있는 동안이 작업을 수행하려고합니다. 나는 현재 정적 변수와 네임 스페이스에 문제가 ... 내 main()에 따라서네임 스페이스의 정적 변수

 
    // Renderer.h 

    namespace Renderer 
    { 
     static IRenderer* g_pRenderer = NULL; 

     static IRenderer* Get(void) { return g_pRenderer; } 

     static IRenderer* CreateD3DRenderer() 
     { 
      g_pRenderer = new RendererD3D(); // Derived from IRenderer 
      return g_pRenderer; 
     } 
    } 

가 있어요, 나는 CreateD3DRenderer()를 호출 할 수 있습니다 그것은 잘 인스턴스를 반환; g_pRenderer은 함수의 범위 내에서 생성되고 반환되기 때문에 그 값을 보유합니다 ... 그러나 Renderer::Get()NULL을 반환합니다. g_pRenderer의 초기화에서 'static'을 제거하면 다른 파일에서 충돌이 발생합니다.

무슨 일 이니?

답변

2

먼저 인수 목록에서 void는 C에서만 필요합니다. C++에서는 Get()을 쓸 수 있습니다.

주요 질문에 대해서는 static 변수가 편집 단위로 제한됩니다. 헤더에 입력 했으므로 포함 된 모든 컴파일 단위 (즉, 모든 cpp 파일)에 대해 별도의 변수가 만들어집니다. static 부분을 제거하면 오류가 발생합니다. 동일한 이름을 가진 여러 변수가있어 링크 오류가 발생하기 때문입니다.

여러 파일간에 단일 변수를 공유하려면 extern을 사용하십시오. 그러나 이것은 나쁜 관행으로 간주됩니다. 리팩토링 (refactoring)을하는 것이 더 낫습니다. 그래서 전역 변수가 필요 없습니다.

당신은 대신에 어떤 일이 일어나고 것은 그 방식으로 사용하는 경우 정적 함수 나 변수가 g_pRenderer를 즉, 그 .cpp 파일로 제한되어 있다는 점이다 .h

의, .cpp 파일에 모든 기능 정의를 유지해야

+0

동일한 이름을 사용하는 다른 변수가 없습니다. 엄밀히 말하면,이 코드가 들어있는 헤더를 포함하면 다시 선언됩니다. 하지만 그렇지 않으면이 이름이 프로그램의 유일한 변수입니다. – Sutanreyu

2

.cpp 파일마다 다릅니다. 각 정의는 .cpp 파일로 제한되어 있기 때문에 여러 정의가 발생하지 않습니다.

글로벌 포인터를 작동 시키려면 제거해야합니다. getter 함수에 정적을 유지할 수는 있지만 제거 할 것입니다. 함수와 전역 변수의 정의를 .cpp 파일로 이동하고 각각의 선언을 .h에 보관해야합니다. 변수를 extern으로 선언하십시오.

관련 문제