Недавно я начал пытаться обеспечить правильность констант в своем коде. В определении функции я передаю постоянный указатель на постоянный объект класса 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<const LorentzM>
но тогда я не смог бы изменить объект через него.
Что не так на этой картинке?
большое спасибо.
Я делаю это, потому что эта функция, SetOwnedPointer, никогда не должна меняться
LorentzM * momentum_In и не должен изменять объект, который он
указывает на постоянный указатель на постоянный объект.
Этого недостаточно. Функция может не изменять объект напрямую, но она предоставляет другой объект ( shared_ptr
) права на изменение объекта. Он не может предоставить права, которых у него нет. Поэтому измените его на указатель на неконстантный объект.
Это то же самое, например, если у вас есть класс, который имеет неконстантный ссылочный член. Вам нужно передать неконстантный объект его конструктору, даже если конструктор сам не изменяет объект. Конструктор должен предоставить права ссылочного члена объекта для изменения объекта, и он не может этого сделать, если сам не имеет этих прав.
Других решений пока нет …