2013-04-06 2 views
0

저는 기본적으로 게임 엔진의 개념에 관한 책 "Game Coding Complete"를 읽었습니다. 리소스 캐시에 관한 부분에는 이해가되지 않는 몇 가지 코드가 있습니다. CreateWAVResourceLoader은()이름없이 shared_ptr 사용 하시겠습니까?!

shared_ptr<IResourceLoader> CreateWAVResourceLoader() 
{ 
    return shared_ptr<IResourceLoader>(GCC_NEW WaveResourceLoader()); 
} 

, 그 후 저자는 파 자원 로더 나에게

m_ResCache->RegisterLoader(CreateWAVResourceLoader()); 

등록과 같은

extern shared_ptr<IResourceLoader> CreateWAVResourceLoader(); 

는 라인 extern shared_ptr<IResourceLoader> CreateWAVResourceLoader();은 조금 혼란 I 때문에 shared_ptr을 반환하는 함수를 호출하지만 이름없이 그 포인터를 어떻게 사용할 수 있습니까? 나는 C++에서의 경험이 부족하다는 것을 확신합니다. 그래서 저를 계몽 해주십시오. :)

고마워요!

+0

'extern' 키워드, 함수 선언에 영향을주지 않습니다 무엇을 혼란이다? – riv

답변

3

해당 줄 입니다. 함수 선언입니다. CreateWAVResourceLoader이며 매개 변수가없고 shared_ptr<IResourceLoader>을 반환합니다.

당신이 말할 때 : 당신이 그것을 호출 할 때

m_ResCache->RegisterLoader(CreateWAVResourceLoader()); 

있다고. 함수에서 반환 된 임시 공유 포인터를 RegisterLoader으로 전달합니다.

+0

이제 나는 그것을 본다.. 많은 두려움! – milchschaum

0
extern shared_ptr<IResourceLoader> CreateWAVResourceLoader(); 

은 함수가 다른 파일 (extern)에 구현되고 shared_ptr을 반환한다는 것을 의미합니다. 전체 라인은 함수 선언이며, 함수의 구현에 지나지 않습니다.

shared_ptr<IResourceLoader> CreateWAVResourceLoader() 
{ 
    return shared_ptr<IResourceLoader>(GCC_NEW WaveResourceLoader()); 
} 

은 함수의 구현에 지나지 않습니다.

+1

정의라고 부르는 것은보다 일반적으로 그리고 정확하게 선언 *이라고 부릅니다. 혼란의 잠재 성을 악화시키기 위해 * 정의 *는 구현의 공식 용어입니다. – delnan

+0

편집하면 이제는 이해하는 것이 더 명확하다는 데 동의합니다. – Plecharts

2

하지만 이름없이 포인터를 어떻게 사용할 수 있습니까?

당신은 shared_ptr을 사용할 사람이 아닙니다. 객체 m_ResCache이됩니다. 그 객체는 리소스를 다루기위한 인터페이스를 가지고 있고 shared_ptrs를 내부적으로 추적한다고 가정합니다.

즉 그것은 다음과 같이이다 :

class foo { 
    public: 
    RegisterLoader(shared_ptr<IResourceLoader> ptr) { internal_ptr = ptr; } 

    DoSomethingWithLoader() { /* ... */ } 
    private: 
    shared_ptr<IResourceLoader> internal_ptr; 
}; 
+0

+1,하지만 멤버 살생 도구를 사용하지 않으셨습니까? – chris

관련 문제