Реализация функций-геттеров

197
18 ноября 2017, 11:56

Как корректно реализовывать функции-геттеры? Я имею ввиду возвращаемое значение. Так:

std::shared_ptr<const number_t> number () const noexcept
{
    return std::make_shared<const number_t> (this->m_number);
}

Или так (в стиле vector::at):

const auto & number () const noexcept
{
    return this->m_number;
}

m_number - поле пользовательского типа, а не стандартного.

Какой вариант считается хорошим стилем сейчас / безопаснее / более удобен и т.п.?

Answer 1

Умный указатель нужен только в том случае, если у нас есть переменная, лежащая в куче, и надо безопасно управлять её временем жизни (то есть с одной стороны не допустить утечки, а с другой — не уничтожить эту переменную раньше времени; именно отсюда и растут ноги понятия «владение» — переменная будет уничтожена только при уничтожении её текущего владельца).

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

Я вам больше скажу — компилятор влёгкую оптимизирует возврат значения. Если это примитивный тип, то он просто записывается в регистр процессора; если нет — применяется RVO (оптимизация возвращаемого значения, частный случай copy elision, о котором я писал в одном из своих ответов).

Возврат по указателю (неважно, обычному или умному) нужен только в том случае, когда мы работаем с сущностями. К примеру, копия графического элемента управления (GUI control) или объекта в игровом мире — это уже новые объекты, не имеющие отношения к своим оригиналам.

READ ALSO
Как наиболее корректно обновлять фон QGraphicsScene?

Как наиболее корректно обновлять фон QGraphicsScene?

Пишу приложение, в котором необходимо, что бы картинка фона графической сцены постепенно менялась, скажем, с таймеромВ документации прочитал,...

284
Сайт визитка html/css

Сайт визитка html/css

Привет, делаю сайт визитку, затык на банальном вопросе не могу вставить изображение на фон только одной (главной) indexhtml страницы

323
Отрисовать спираль на сайте

Отрисовать спираль на сайте

Интересует какими лучше способами нарисовать (анимировать само рисование спирали) спираль Ферма на сайте? (Чтобы пользователь видел как...

379