【问题标题】:const correctness and shared_ptr, a matter of design?const 正确性和 shared_ptr,设计问题?
【发布时间】:2012-12-14 14:18:32
【问题描述】:

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

但是,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
}

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

owned_pp4_original.reset(momentum_In); 

owned_pp4_original 应该是shared_ptr&lt;const LorentzM&gt;

但是,我将无法通过它更改对象。

这张图片有什么问题?

非常感谢。

【问题讨论】:

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


    【解决方案1】:

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

    这还不够。该函数可能不会直接更改对象,但它正在授予另一个对象(shared_ptr)修改对象的权限。它不能授予它自己没有的权利。所以把它改成指向非 const 对象的指针。

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

    【讨论】:

    • 感谢您的回复。然后我误解了 const 正确性的那一部分。你说的更有意义。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-24
    • 2013-01-08
    • 1970-01-01
    • 1970-01-01
    • 2010-10-07
    • 2017-10-22
    相关资源
    最近更新 更多