Getter и Setter для указателя

262
02 июля 2022, 22:10

Вопрос заключается в том, как правильно реализовать Getter для указателя, чтобы он был "безопасным". Под безопасностью я подразумеваю предотвращение несанкционированного удаления указателя. Давайте рассмотрим пример:

class MediaSettings
{
public:
    // ...
    virtual bool isValid() noexcept = 0;
    // ...
};
class AudioSettings : public MediaSettings
{
public:
    // ...
    virtual bool isValid() noexcept override;
    // ...
};
class MediaRecorder
{
public:
    // ...
    void setSettings(MediaSettings* settings) noexcept;
    const MediaSettings* getSettings()  const noexcept;
    // ...
protected:
    QScopedPointer<MediaSettings> p_settings{ nullptr };
};
const MediaSettings* MediaRecorder::getSettings() const noexcept
{
    return p_settings ? p_settings.get() : nullptr;
}

И пример использования:

MediaRecorder recorder;
MediaSettings* settings = new AudioSettings(...);
if (settings->isValid) {
    recorder.setSettings(settings);
}

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

Я также где-то слышал, что нежелательно возвращать ссылку или указатель на скрытую переменную.

Answer 1

Предложу вариант попроще:

class MediaRecorder
{
public:
    // ...
    void setSettings(const MediaSettings& settings) noexcept
    {
        //проверить, валидные ли параметры аудио настроек
        //Учитывая, что вызов `isValid` должен быть разрешен и для константных объектов,
        // и метод нужно объявить с квалификатором const
        valid = settings.isValid();
    }  
    void disable() noexcept { if (valid) valid = false; }
    operator bool() { return valid; }
    // ...
protected:
    bool valid{};        
};

Пример использования:

MediaRecorder recorder;
recorder.setSettings(AudioSettings());
// ...    
if (recorder) {        
   qDebug()  << "Audio settings is not valid";
   // ...         
}

Но как лучше _ зависит от реализации и намерений...

READ ALSO
Как использовать std::bind с методами класса?

Как использовать std::bind с методами класса?

Пытаюсь использовать std::bind с методом класса:

221
Преобразование типа вектора из uint8 в uint16

Преобразование типа вектора из uint8 в uint16

Есть вектор std::vector<uint8_t> From; Он содержит 10^9 элементов

208
Помогите решить проблему с кодом на Arduino

Помогите решить проблему с кодом на Arduino

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

217