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

ele*_*ias 5 c++ boost const-correctness shared-ptr

我最近开始尝试在我的代码中强制执行const正确性.在函数定义中,我提供一个指向类的常量对象的常量指针LorentzM:

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

这里owned_pp4_original

shared_ptr<LorentzM> owned_pp4_original;
Run Code Online (Sandbox Code Playgroud)

我这样做,因为这个函数,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
}
Run Code Online (Sandbox Code Playgroud)

所以,一方面,能够做到:

owned_pp4_original.reset(momentum_In); 
Run Code Online (Sandbox Code Playgroud)

owned_pp4_original 应该是一个 shared_ptr<const LorentzM>

但是,我无法通过它改变对象.

这张照片有什么问题?

非常感谢.

Ben*_*ley 5

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

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

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