2014-07-12 4 views
2

다른 클래스의 .h 및 .cpp 파일에서 액세스 할 수 있어야한다는 의미에서 "전역 적"이어야하는 객체가 있습니다. 이렇게 접근하는 방법을 잘 모르겠습니다. 문제를 자세히 설명하겠습니다.글로벌 C++ 객체 만들기

저는 CoreEnvironment라는 클래스가 있습니다. 이 클래스는 내 엔진의 핵심을 렌더링, 네트워킹, 물리 및 PathFinding과 같은 가장 낮은 수준에서 유지합니다. 이 클래스의 인스턴스는 한 번에 하나만 존재할 수 있으며 응용 프로그램의 전체 수명 동안 존재합니다. 내 첫 번째 생각은 싱글 톤으로 작성하는 것이었지만 연구를 한 후에 싱글 톤 사용에 대한 부정적인 의견이 많지 않았으며 싱글 톤을 만드는 방법을 완전히 이해하지 못했습니다. 내 연구에서 나는 "Extern"키워드의 사용법을 보았지만 사용법은 분명하지 않았습니다.

class CoreEnvironment 
{ 
    NetHandler* m_NET; 
    NetPoint* Server; 
    PhysicsHandler* m_Physics; 
    irr::IrrlichtDevice* Device; 
    irr::ITimer* Timer; 

public: 
    CoreEnvironment(); 
    ~CoreEnvironment(); 

    bool RunDevice(); 
    void Update(); 
} CoreEnv; 

내가 같은 내 엔진의 일부 높은 수준의 수업이 있습니다 : ActorHandler 및 WorldHandler을 여기

는 클래스의 골격이다. 이 두 클래스의 .cpp 파일에서 CoreEnv에 액세스해야합니다. "CoreEnvironment.h"를 #include하면 CoreEnv의 다른 인스턴스가 파일이 포함될 때마다 만들어 지지만 초기화 된 원래의 인스턴스에 액세스해야합니다.

이 전체 구조가 잘못된 접근 방법 일 수 있습니다. 이 문제를 해결하거나보다 효율적인 접근법에 대한 조언이나 제안은 크게 감사하겠습니다. 시간 내 주셔서 감사합니다.

+0

"singleton"은 이러한 요구 사항을 충족하는 패턴이기 때문에 훌륭한 태그를 만듭니다. 어떤 "부정적인 의견"이 당신이 그것을 사용하지 못하게 했습니까? 또는 당신은 무엇을 "완전히 이해하지 못했습니까"? – Solkar

답변

4

헤더 파일 내에 개체 인스턴스를 정의하지 마십시오. 거기에 선언을 제공하고 단일 cpp 파일에서 오브젝트를 정의하십시오. 예를 들어,

CoreEnvironment.h

class CoreEnvironment 
{ 
    NetHandler* m_NET; 
    NetPoint* Server; 
    PhysicsHandler* m_Physics; 
    irr::IrrlichtDevice* Device; 
    irr::ITimer* Timer; 

public: 
    CoreEnvironment(); 
    ~CoreEnvironment(); 

    bool RunDevice(); 
    void Update(); 
}; 

extern CoreEnvironment CoreEnv; 

CoreEnvironment.cpp

#include "CoreEnvironment.h" 

CoreEnvironment CoreEnv; 

그리고 CoreEnv 개체에 대한 액세스를 필요로 두 개의 다른 클래스가있는 경우, 아마 당신은 다시 생각한다 글로벌 인스턴스의 필요성. 대신 이와 같은 것으로 충분할 수 있습니다.

int main() 
{ 
    CoreEnvirnment CoreEnv; 
    ActorHandler actor(CoreEnv); 
    WorldHandler world(CoreEnv); 

    // do stuff with actor and world 
} 

ActorHandlerWorldHandler 테이크의 생성자 (아마도 const) CoreEnvironment에 대한 참조.

+0

감사합니다. 나는 그것들을 생성자에 전달하는 것에 대해 생각했지만 클래스가 3 개 이상이고 클래스 내에 다른 객체가 만들어 져서 CoreEnv에 대한 액세스가 필요하며 심지어 그러한 객체 중 일부라도 CoreEnv가 필요한 다른 객체를 만들었으므로 잘되지 않았습니다. 나는 여러 번 그 계층 구조를 통과시켰다. – KKlouzal

+2

@KKlouzal 전역 인스턴스와 싱글 톤이 왜 나쁜지에 대한 좋은 답변을 찾을 수 있어야하지만 때로는 심층 계층을 통해 객체 참조를 전달하는 것보다 편리합니다. 결국 네거티브와 편의성의 균형을 맞추고 유스 케이스에 대한 올바른 결정을 내릴 수 있습니다. – Praetorian