2013-09-28 2 views
0

개체에 대한 포인터가있을 때 포인터가 아닌 변수를 어떻게 만듭니 까?포인터에서 스택 객체를 초기화하는 방법은 무엇입니까?

내 상황은 다음과 같습니다. 파일을로드하는 TFile 클래스가 있습니다. 여기에는 여러 가지 다른 이름의 객체가 포함될 수 있습니다. TFile에는 Get 메서드가 있습니다 (void* 반환). 이러한 개체 중 하나를 검색 할 수 있습니다. 내가 일반적으로 할 것은 :

TFile file("filename", "READ"); 
TTree* tree = (TTree*) file.Get("treename"); 

이제 내가 뭘하려는 대신이 아닌 포인터로 TTree tree를 선언 할 수 있도록이며, 반환 된 포인터에서 초기화했다. 이 작업을 수행 할 수있는 방법이 있습니까 (개체를 복사하지 않고 TTree의 원본을 편집하지 않는 것이 좋습니다)?

+0

아니요 복사하지 않으면 불가능합니다. 그리고'TFile'과'TFile :: Get'의 구현에 따라 메모리 누수가 발생할 수도 있습니다. –

답변

3

당신은 단지 포인터가 아닌 객체의 구문을 원하는 경우, 참조 사용

TTree& tree = *static_cast<TTree*>(file.Get("treename")); 

(I 필요하지 않은하는 static_cast와 C 스타일 캐스트를 교체하지만, 일반적으로 간주합니다을 좋은 스타일입니다.)

TTree*을 삭제해야하는 경우 TTree&으로 신고한다고해서 의무에서 면제되지는 않습니다.

Tree & tree = *static_cast<TTree*>(file.Get("treename")); 

는 개체가 적어도 한 살아 계심을 보장하기위한 TFile의 설명서를 확인하십시오 :

+0

감사합니다. 포인터로 참조를 만드는 것에 대해 생각하지 않았습니다. 정리에 관하여 : 내가 사용하고있는 라이브러리 ([ROOT] (http://root.cern.ch))는 다소 흐릿합니다. 문서에는 누가 반환 가치의 소유권을 가지고 있는지, 어떻게 그것을 공개해야하는지에 대한 설명이 없습니다. 일반적으로 전형적인 프로그램은 수명이 짧기 때문에 누출되면 문제가되지 않지만 여전히 불안한 느낌을줍니다. – jdm

+1

가능하면 잘 모르겠지만 NULL을 테스트해야 할 수도 있습니다. void * pVoid = file.Get ("treename"); if (pVoid) {TTree & tree = * static_cast (pVoid); ...}' – franji1

2

당신은 개체에 대한 참조를 만들 수는 개체의 수명이 충분한 제공 tree 변수.