На самом деле, ссылка - это нормальный способ сделать это. У каждого учителя может быть школа, которая не является уникальной среди всех учителей, поэтому, чтобы знать эту школу, необходимо добавить ссылку. Я не понимаю, почему это не элегантно.
Кроме того, возможно, что у учителя нет школы, поэтому обнулите ссылку, или, если у учителя может быть несколько школ, вам нужен список школ для справки.
Если вы действительно не хотите эту ссылку, другой вариант - пройтись по всем школам и найти интересующего вас учителя. Если учитель может преподавать только в одной школе, вы можете прекратить поиск, когда найдете учителя. в противном случае вы должны составить список, повторяя все школы и учителей. Это довольно не элегантное решение, и его следует использовать, только если вы хотите минимизировать объем памяти. Время обработки может значительно увеличиться.
В то время как у меня нет общего ответа или некоторой идиомы, существует boost::enable_shared_from_this
. Это позволяет Вам получать shared_ptr, управляющий объектом, которым уже управляет shared_ptr. С тех пор в функции членства у Вас нет ссылки на тех, которые руководящий shared_ptr, enable_shared_ptr действительно позволяет Вам получать shared_ptr экземпляр и передачу это, когда необходимо передать этот указатель.
Но это не решит проблему передачи this
из конструктора, с тех пор в то время, никакой shared_ptr еще не управляет Вашим объектом.
Один пример корректного использования return *this;
в функциях как оператор ++ () и оператор <<().
При использовании класса интеллектуального указателя Вы правы, что это опасно для прямого представления"this
". Существуют некоторые классы указателя, связанные с boost::shared_ptr<T>
это может быть полезным:
boost::enable_shared_from_this<T>
boost::weak_ptr<T>
NULL
вместо указателя на недопустимую память. Можно использовать слабые указатели для получения совместно использованных указателей на считаемый на действительную ссылку объект.Ни один из них не является надежным, конечно, но они, по крайней мере, сделают Ваш код более стабильным и защитят при обеспечении соответствующего доступа и подсчета ссылок для объектов.
Другая опция использует навязчивые интеллектуальные указатели и заботится о подсчете ссылок в самом объекте, не указателях. Это требует немного большего количества работы, но на самом деле более эффективно и легко управлять.
Если необходимо использовать this
, просто используйте его явно. Интеллектуальные указатели переносят только указатели объектов, которыми они владеют - любой исключительно (unique_ptr
) или общим способом (shared_ptr
).
Другая причина раздать это состоит в том, если Вы хотите сохранить центральный реестр всех объектов. В конструкторе, вызовы объектов статический метод реестра с этим. Ее полезные для различного публикуют/подписывают механизмы, или когда Вы не хотите, чтобы для реестра было нужно знание того, какие объекты/классы находятся в системе.
Мне лично нравится использовать этот указатель при доступе к членским переменным класса. Например:
void foo::bar ()
{
this->some_var += 7;
}
Это - просто безопасный вопрос стиля. Некоторые люди как он, somepeople не делают.
Но использование этого указателя для любой другой вещи, вероятно, вызовет проблемы. Если действительно необходимо сделать необычные вещи с ним, необходимо действительно пересмотреть дизайн. Я однажды видел некоторый код, что в конструкторе класса он присвоил этот указатель на другой указатель, сохраненный где-то в другом месте! Это является просто сумасшедшим, и я никогда не могу думать о причине сделать это. Целый код был огромной путаницей, между прочим.
Можно ли сказать нам, что точно Вы хотите сделать с указателем?