интеллектуальные указатели +, который рассматривают вредным?

На самом деле, ссылка - это нормальный способ сделать это. У каждого учителя может быть школа, которая не является уникальной среди всех учителей, поэтому, чтобы знать эту школу, необходимо добавить ссылку. Я не понимаю, почему это не элегантно.

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

Если вы действительно не хотите эту ссылку, другой вариант - пройтись по всем школам и найти интересующего вас учителя. Если учитель может преподавать только в одной школе, вы можете прекратить поиск, когда найдете учителя. в противном случае вы должны составить список, повторяя все школы и учителей. Это довольно не элегантное решение, и его следует использовать, только если вы хотите минимизировать объем памяти. Время обработки может значительно увеличиться.

11
задан Helen 17 July 2009 в 20:11
поделиться

7 ответов

В то время как у меня нет общего ответа или некоторой идиомы, существует boost::enable_shared_from_this . Это позволяет Вам получать shared_ptr, управляющий объектом, которым уже управляет shared_ptr. С тех пор в функции членства у Вас нет ссылки на тех, которые руководящий shared_ptr, enable_shared_ptr действительно позволяет Вам получать shared_ptr экземпляр и передачу это, когда необходимо передать этот указатель.

Но это не решит проблему передачи this из конструктора, с тех пор в то время, никакой shared_ptr еще не управляет Вашим объектом.

13
ответ дан 3 December 2019 в 01:30
поделиться

Один пример корректного использования return *this; в функциях как оператор ++ () и оператор <<().

5
ответ дан 3 December 2019 в 01:30
поделиться

При использовании класса интеллектуального указателя Вы правы, что это опасно для прямого представления"this". Существуют некоторые классы указателя, связанные с boost::shared_ptr<T> это может быть полезным:

  • boost::enable_shared_from_this<T>
    • Обеспечивает способность иметь объект возвращают общий указатель на себя, который использует те же данные подсчета ссылок в качестве существующего общего указателя на объект
  • boost::weak_ptr<T>
    • Работы рука об руку с общими указателями, но не содержат ссылку на объект. Если все общие указатели уйдут, и объект выпущен, то слабый указатель сможет сказать, что объект больше не существует и возвратит Вас NULL вместо указателя на недопустимую память. Можно использовать слабые указатели для получения совместно использованных указателей на считаемый на действительную ссылку объект.

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

5
ответ дан 3 December 2019 в 01:30
поделиться

Другая опция использует навязчивые интеллектуальные указатели и заботится о подсчете ссылок в самом объекте, не указателях. Это требует немного большего количества работы, но на самом деле более эффективно и легко управлять.

1
ответ дан 3 December 2019 в 01:30
поделиться

Если необходимо использовать this, просто используйте его явно. Интеллектуальные указатели переносят только указатели объектов, которыми они владеют - любой исключительно (unique_ptr) или общим способом (shared_ptr).

1
ответ дан 3 December 2019 в 01:30
поделиться

Другая причина раздать это состоит в том, если Вы хотите сохранить центральный реестр всех объектов. В конструкторе, вызовы объектов статический метод реестра с этим. Ее полезные для различного публикуют/подписывают механизмы, или когда Вы не хотите, чтобы для реестра было нужно знание того, какие объекты/классы находятся в системе.

0
ответ дан 3 December 2019 в 01:30
поделиться

Мне лично нравится использовать этот указатель при доступе к членским переменным класса. Например:

void foo::bar ()
{
    this->some_var += 7;
}

Это - просто безопасный вопрос стиля. Некоторые люди как он, somepeople не делают.

Но использование этого указателя для любой другой вещи, вероятно, вызовет проблемы. Если действительно необходимо сделать необычные вещи с ним, необходимо действительно пересмотреть дизайн. Я однажды видел некоторый код, что в конструкторе класса он присвоил этот указатель на другой указатель, сохраненный где-то в другом месте! Это является просто сумасшедшим, и я никогда не могу думать о причине сделать это. Целый код был огромной путаницей, между прочим.

Можно ли сказать нам, что точно Вы хотите сделать с указателем?

1
ответ дан 3 December 2019 в 01:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: