2012-12-14 32 views
5

我最近開始嘗試在我的代碼中強制const正確性。在函數的定義,我養活一個常量指針到類LorentzM的恆定對象:const正確性和shared_ptr,設計的問題?

void AnalysisObject::SetOwnedPointer(const int maptotree_In, const LorentzM* const momentum_In){ 
owned_pp4_original.reset(momentum_In); 
maptotree=maptotree_In; 
} 

其中owned_pp4_original

shared_ptr<LorentzM> owned_pp4_original; 

我這樣做,因爲這個功能,SetOwnedPointer,應該永遠不變的LorentzM* momentum_In也不應該改變它指向的對象,所以它是常量對象的常量指針。

然而,一個shared_ptr創建到對象,其中momentum_In點,我想用這個shared_ptr的改變以後的對象:

void ChangeLorentzM(const double px, const double py, const double pz, const double E){ 
owned_pp4_original->SetPxPyPzE(px,py,pz,E); //THIS CHANGES THE OBJECT 
} 

因此,一方面,要能夠做到:

owned_pp4_original.reset(momentum_In); 

owned_pp4_original應該是一個shared_ptr<const LorentzM>

但後來,我不會無法通過它改變對象。

這張照片有什麼問題?

非常感謝。

回答

5

我這樣做,因爲這個功能,SetOwnedPointer,應該永遠不會改變 的LorentzM * momentum_In也不應改變物體,它 點,所以常指針常量對象是。

這不夠理由。該函數可能不會直接更改對象,但會授予另一個對象(shared_ptr)修改對象的權限。它不能授予它自己沒有的權利。所以把它改爲一個指向非const對象的指針。例如,如果您有一個具有非const引用成員的類,則它是同樣的事情。您需要將非const對象傳遞給其構造函數,即使構造函數本身不修改該對象。構造函數需要授予對象的引用成員權限來修改對象,如果它本身沒有這些權限,則不能這樣做。

+0

感謝您的回覆。然後我誤解了const正確性的那部分。你說的話更有意義。 – elelias