繁体   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