const正确性和shared_ptr,设计问题?

时间:2012-12-14 14:18:32

标签: c++ boost shared-ptr const-correctness

我最近开始尝试在代码中强制执行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,也不应该更改它指向的对象,所以常量指针指向常量对象。

但是,为momentum_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>

然后,我无法通过它改变对象。

这张照片有什么问题?

非常感谢。

1 个答案:

答案 0 :(得分:5)

  

我这样做,因为这个函数SetOwnedPointer永远不会改变   LorentzM * momentum_In也不应该改变它的对象   指向,所以常量指针指向常量对象。

这不够理智。该函数可能不会直接更改对象,但它授予另一个对象(shared_ptr)修改对象的权限。它不能授予它自己没有的权利。因此,将其更改为指向非const对象的指针。

同样的事情,例如,如果你有一个具有非const引用成员的类。您需要将非const对象传递给它的构造函数,即使构造函数本身不修改该对象。构造函数需要授予对象的引用成员权限来修改对象,如果它本身没有这些权限,则不能这样做。