Информация об изменениях

Сообщение Re: Ссылка от 06.12.2023 16:16

Изменено 06.12.2023 18:27 rg45

Re: Ссылка
Здравствуйте, CEMb, Вы писали:

CEM>
CEM>class Device;
CEM>class Object
CEM>{

CEM>private:
CEM>    std::unique_ptr<Device> device_{};

CEM>    const float& reloadTime_; // условно, это ссылка, по которой вопрос
CEM>};
CEM>


CEM>Чего хочется:

CEM>1. Удобства в коде. Поэтому любые другие идеи приветствуются тоже!
CEM>2. Оптимизации. Но даже с GetReloadTime() проблем бы не было: компилятор туда ровно ту же ссылку на переменную Device::reloadTime_ поставит. Единственный момент тут — это проверка, что device_ не nullptr. Таких объектов как reloadTime_ может быть много, и они активно используются в логике. Хотелось бы не добавлять условия, если есть возможность это не делать.

Я не совсем понимаю, каким образом эта ссылка избавляет от проверок device_ на nullptr. Ведь когда заканчивается вермя жизни объекта device, ссылка тут же становится невалидной. А если устройство класса Object гарантирует, что время жизни объекта Object не превышает время жизни объекта Device, то проверки на nullptr достаточно только одной — в конструкторе класса Object.

Приватная фунция-член вместо ссылки — не вариант?

class Device;
class Object
{

private:
    std::unique_ptr<Device> device_{};

    float reloadTime() const
    { 
         assert(device_);        
         return device_->GetReloadTime();
    }
};


И в коде потом используешь reloadTime() вместо reloadTime_;
Re: Ссылка
Здравствуйте, CEMb, Вы писали:

CEM>
CEM>class Device;
CEM>class Object
CEM>{

CEM>private:
CEM>    std::unique_ptr<Device> device_{};

CEM>    const float& reloadTime_; // условно, это ссылка, по которой вопрос
CEM>};
CEM>


CEM>Чего хочется:

CEM>1. Удобства в коде. Поэтому любые другие идеи приветствуются тоже!
CEM>2. Оптимизации. Но даже с GetReloadTime() проблем бы не было: компилятор туда ровно ту же ссылку на переменную Device::reloadTime_ поставит. Единственный момент тут — это проверка, что device_ не nullptr. Таких объектов как reloadTime_ может быть много, и они активно используются в логике. Хотелось бы не добавлять условия, если есть возможность это не делать.

Я не совсем понимаю, каким образом эта ссылка избавляет от проверок device_ на nullptr. Ведь когда заканчивается вермя жизни объекта device, ссылка тут же становится невалидной. А если устройство класса Object гарантирует, что время жизни объекта Object не превышает время жизни объекта Device, то проверки на nullptr достаточно только одной — в конструкторе класса Object.

Приватная фунция-член вместо ссылки — не вариант?

class Device;
class Object
{

private:
    std::unique_ptr<Device> device_{};

    float reloadTime() const { 
         assert(device_);        
         return device_->GetReloadTime();
    }
};


И в коде потом используешь reloadTime() вместо reloadTime_;