5

私は最近、自分のコードで 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それが指しているオブジェクトを変更したり変更したりしてはならないため、定数オブジェクトへの定数ポインターです。

ただし、motion_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>

しかし、それを介してオブジェクトを変更することはできません。

この写真のどこが間違っていますか?

どうもありがとう。

4

1 に答える 1

5

これを行うのは、この関数 SetOwnedPointer が LorentzM* Momentum_In を変更したり、それが指すオブジェクトを変更したりしてはならないためです。つまり、定数オブジェクトへの定数ポインターです。

それは十分な理由ではありません。この関数はオブジェクトを直接変更することはできませんが、別のオブジェクト ( shared_ptr) にオブジェクトを変更する権限を付与しています。それ自体が持っていない権利を付与することはできません。そのため、非 const オブジェクトへのポインターに変更します。

たとえば、非 const 参照メンバーを持つクラスがある場合も同じです。コンストラクター自体がオブジェクトを変更しない場合でも、非 const オブジェクトをコンストラクターに渡す必要があります。コンストラクターは、オブジェクトを変更するためにオブジェクトの参照メンバーの権利を付与する必要があります。コンストラクター自体がそれらの権利を持っていない場合は、それを行うことはできません。

于 2012-12-14T14:28:07.403 に答える