簡體   English   中英

const正確性和shared_ptr,是設計問題嗎?

[英]const correctness and shared_ptr, a matter of design?

我最近開始嘗試在代碼中強制執行const正確性。 在函數定義中,我提供了一個指向LorentzM類的常量對象的常量指針:

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 _In,也不要更改它指向的對象,因此它是指向常量對象的常量指針。

但是,已為動量_In指向的對象創建了一個shared_ptr,我以后確實想使用此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>

但是那樣,我將無法通過它更改對象。

這幅畫怎么了?

非常感謝。

我這樣做是因為,此函數SetOwnedPointer永遠不要更改LorentzM *動量_In,也不要更改它指向的對象,因此它是指向常量對象的常量指針。

這還不夠。 該函數可能不會直接更改對象,但是會授予另一個對象( shared_ptr )修改該對象的權限。 它不能授予自己沒有的權利。 因此,將其更改為指向非常量對象的指針。

例如,如果您有一個具有非常量引用成員的類,那就是同一回事。 您需要將非常量對象傳遞給其構造函數,即使該構造函數本身並未修改該對象。 構造函數需要授予對象的引用成員權限才能修改該對象,如果它本身不具有這些權限,則不能這樣做。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM