Собственность и необработанные указатели?
Интеллектуальные указатели обычно поставляются с семантикой владения, поэтому использование любого из них, когда вы не хотите давать/разделять владение, является плохой идеей.
В моем собственном коде я решил следующее соглашение:
необработанные указатели означают отсутствие передачи прав собственности/совместного использования
Это означает, что если некоторые функции получают необработанный указатель в качестве параметра, то он не имеет права собственности (и, следовательно, не должен пытаться его удалить). Точно так же функция, возвращающая необработанный указатель, не передает/не разделяет право собственности (поэтому, опять же, вызывающая сторона не должна пытаться удалить его).
Итак, в вашем случае вы можете вернуть указатель вместо умного указателя.
Указатель или ссылка?
Это означает, что выбор между указателем и ссылкой зависит только от одного фактора, определяемого следующим правилом:
- Если значение
nullptr
/NULL
имеет смысл, используйте указатели.
- Если значение
nullptr
/NULL
не имеет смысла и/или нежелательно, используйте ссылки.
константность и переменные-члены?
Я видел несколько ответов на постоянство, поэтому добавляю свои два цента:
Возврат неконстантного значения во внутреннюю переменную — выбор дизайна. Что вы должны сделать, так это выбрать один из следующих геттеров:
const Transform * getTransform() const ;
Transform * getTransform() ;
Я вызываю (оскорбительно) методы доступа над свойством, а неконстантная версия позволяет пользователю изменять внутренний объект Transform на досуге, без необходимости сначала спрашивать ваш класс. Вы заметите, что если GameObject является константным, нет способа изменить его внутренний объект Transform (единственный доступный геттер — это константный, возвращающий константу). Вы также заметите, что вы не можете изменить адрес объекта Transform внутри GameObject. Вы можете изменить указатель данных только по этому адресу (что отличается от того, чтобы сделать переменную-член общедоступной).
const Transform *& getTransform() const ;
Transform *& getTransform() ;
Это похоже на ситуацию выше, но благодаря ссылке пользователь имеет прямой доступ к адресу указателя, а это означает, что неконстантный метод доступа более или менее похож на то, чтобы сделать переменную-член общедоступной.
const Transform * getTransform() const ;
void setTransform(Transform * p_transform) ;
Я вызываю (оскорбительно) методы доступа над геттером/сеттером: если пользователь хочет изменить значение преобразования, он должен использовать метод setTransform. У вас гораздо больше контроля над тем, что вы делаете (обратите внимание, что в моем коде установщику вы передаете unique_ptr или auto_ptr, чтобы выразить приобретение полного владения объектом p_transform. Вы заметите, что если GameObject является константой , нет способа изменить его внутренний объект Transform (сеттер не является константным).
Transform * getTransform() const ;
Я вызываю (оскорбительно) метод доступа над нижним индексом, так как в массивах указателей массив может быть константным, и, следовательно, внутренний адрес является константным, но данные, на которые указывает этот адрес, неконстантны, поэтому их можно изменить. Обычно это означает, что объект Transform на самом деле не принадлежит вашему объекту GameObject. Действительно, возможно, GameObject ссылается только на какой-то внешний объект для простоты использования.
person
paercebal
schedule
12.06.2013