Вопрос заключается в том, как правильно реализовать 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
.
Я также где-то слышал, что нежелательно возвращать ссылку или указатель на скрытую переменную.
Предложу вариант попроще:
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";
// ...
}
Но как лучше _ зависит от реализации и намерений...
Есть вектор std::vector<uint8_t> From; Он содержит 10^9 элементов
Прошу, помогите найти код в ошибке и решить проблему, а то моя тупая головушка не может понять конкретного местаПрошу, не судите строго, я новичок...