[英]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.