2013-09-28 56 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")); 

(請注意,我更換了C樣式轉換與static_cast,這是沒有必要的,但通常被認爲是好樣式)

但是,請注意,如果您不得不刪除TTree*,將其聲明爲TTree&將不會使您免於此義務。

+0

謝謝,工作!我沒有考慮用指針做參考。關於清理:我正在使用的庫([ROOT](http://root.cern.ch))在那裏有點模糊。該文檔既沒有說明誰擁有返回值的所有權,也沒有說明如何發佈它。通常情況下,泄漏並不重要,因爲典型的節目是短暫的,但仍然讓人感到不安。 – jdm

+1

不知道這是否可能,但您可能需要測試NULL'void * pVoid = file.Get(「treename」); if(pVoid){TTree&tree = * static_cast (pVoid); ...}' – franji1

2

您可以對對象的引用,所提供的對象的生命週期是不夠的:

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

一定要檢查的TFile文檔中關於保證對象居住至少只要你tree變量。