2011-01-25 4 views
0

모두 안녕하세요!
최근 C++ 프로그램에서 헤더 파일을 사용하기 시작했으며, 모든 파일에서 전역 변수를 초기화하는 가장 좋은 방법이 궁금합니다.헤더 파일에 설정된 모든 파일에서 변수를 전역 적으로 사용

나는 init(), render(), loop(), event() ... 등의 프로그램 클래스를 개략적으로 보여주는 헤더 파일을 가지고있다. 이들 각각은 그들 자신의 파일 내에 설정되어있다. init.cpp 등 ..
그래서 모든 파일에서 사용할 수 있도록 변수를 초기화하는 가장 좋은 방법은 무엇입니까? 헤더 파일에서해야합니까? 아니면 그것에 대해 갈 수있는 나쁜 방법입니다.

미리 감사드립니다. 조직 정보와

-Devan

편집, 어떤 코드 블록이 없기 때문에 의견에하고 싶지 않았다. 여기

내 헤더 파일 (CGame.h) 다음
class CGame 
{ 
public: 
    CGame(); 
    int execute(); 
    bool init(); 
    void event(); 
    void loop(); 
    void render(); 
    void cleanUp(); 
protected: 

private: 
bool running; 

} 

그리고 그 각각의 방법을

그런 다음 자신의 .cpp 파일

#include "CGame.h" 
void CGame::render() 
{ 
} 

내에 정의 그들 모두가 내 부름 내 main.cpp

CGame::CGame() 
{ 
    running = true; 
} 

int CGame::execute() 
{ 
    if(init() == false) 
    { 
     return -1; 
    } 

    while(running) 
    { 
     loop(); 
     render(); 
    } 
     cleanUp(); 
     return 0; 
} 

int main (void) 
{ 
    CGame app; 
    return app.execute(); 
} 

올바른 방법이 아닌가요? 이전 SDL 튜토리얼에서 읽은 것 같습니다.

+0

어쩌면 내가 틀린 글을 읽고있는 것일 수도 있지만, 클래스의 각 메소드를 별도의 파일에 정의하는 것처럼 들리 겠지만, 이는 갈 길이 아닙니다. 프로젝트 구성 방법에 대한 자세한 개요를 게시 할 수 있습니까? – suszterpatt

+0

@suszterpatt 개요를 사용하여 게시물을 편집했습니다. 그래, 내가하려고했던 방식대로 네가 옳았 어. –

+0

자체의 cpp 파일에 각 메소드를 정의하는 것을 금지하지 않습니다. 때로는 클래스를 여러 파일로 분할하는 것 (예 : 클래스 정의의 일부가 GUI 빌더에 의해 자동으로 생성되는 경우)도 유용합니다. 그러나 일반적으로 매우 드문 경우입니다. – Oswald

답변

4

전역 변수를 사용하지 마십시오.

전역 변수없이 수행 할 때까지 변수를 헤더 파일에서 extern으로 선언하십시오 (예 : extern int pi). 이것은 컴파일러에게 "pi이라는 이름의 정수가 존재합니다. 어디 있는지는 상관하지 않으며, 링커는 찾을 위치를 알 수 있습니다"라고 알려줍니다. 그렇게하면 어디에서나 초기화 할 수 있습니다.

최상의 위치는 개인 취향의 문제입니다. 기본적으로 모든 변수에 대해 중앙 C++ 파일을 사용하거나 가장 밀접하게 관련된 C++ 파일에 넣습니다. 특히 변수가 하나의 소스 파일에서만 사용되는 경우에는 헤더에 넣지 말고 선언하고 해당 소스 파일에서 정의하십시오.

+0

감사합니다. 외부 점검이 불량합니다. 하지만 그게 어디서나 나는 헤더 파일에 포함 된 모든 파일에서 그것을 사용할 수 초기화하는 뜻인가요? –

+0

@pwnmonkey : 예. 그것이 헤더 파일의 목적입니다. 하나의 소스 파일에서만 사용하는 경우에는 헤더 대신 소스 파일에서 선언하고 정의하십시오. – Oswald

+0

@pwnmonkey 예. 전체 헤더를 포함하고 싶지 않다면, 단지'extern int AnInt'를 선언 할 수 있습니다. 그리고 다른 파일이'int AnInt'를 가지고있는 한 작동 할 것입니다. – KitsuneYMG

관련 문제