const корректность и общий ptr, вопрос дизайна?


Недавно я начал пытаться обеспечить корректность 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, и I хотите ли использовать этот 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>

Но тогда я не смог бы изменить объект через него.

Что не так в этой картине?

Большое спасибо.

1 5

1 ответ:

Я делаю это, потому что эта функция, SetOwnedPointer, никогда не должна меняться The LorentzM * momentum_In и не должен изменять объект, который он указывает на, так что постоянный указатель на постоянный объект это.

Это еще не достаточная причина. Функция не может изменять объект непосредственно, но она предоставляет другому объекту (shared_ptr) права на изменение объекта. Он не может предоставить права, которых у него самого нет. Поэтому измените его на указатель на неконстантный объект.

Это то же самое, например, если у вас есть класс, который имеет неконстантный ссылочный член. Необходимо передать неконстантный объект его конструктору, даже если конструктор сам не изменяет объект. Конструктор должен предоставить объекту права ссылочного члена для изменения объекта, и он не может этого сделать, если у него самого нет этих прав.