Это небольшое руководство для начинающих специалистов. Быстро освоить setter и getter в C++ и Qt. Просто и без воды. То, что необходимо для старта.
Этот guide касается темы инкапсуляции данных на Cpp.
Хотел бы отметить, что данный материал я использую для своих занятий на предприятии с новыми специалистами в ходе их подготовки.
Поэтому он не является исчерпывающим, просто пример одного нашего занятия.
1. Что не так с переменными в классе?
- Нет проверки на ошибки (другой термин: валидность) входных данных.
- Доступ public: пиши что хочешь, Никто не будет ничего проверять, просто присвоит данные без условий как захочет.
- При частом использовании этой переменной в коде может сложиться ситуация изменения названия этой переменной. Тогда необходимо найти в коде все все места, чтобы всё поменять. Сто процентов это будет трудозатратно и повлечет за собой ошибки. Так делать нельзя.
Чтобы контролировать данные, делаем переменные private
Теперь нельзя получить доступ к переменной, нет возможности менять её напрямую и случайно испортить данные.
2. Что такое setter и getter в C++ и зачем они нужны?
Теперь сделаем правильно. Нам нужны два метода, чтобы правильно управлять доступом к приватным переменным класса -
- чтобы ЗАПИСАТЬ данные в эту "переменную" (setter), и
- чтобы ПРОЧИТАТЬ данные из этой "переменной" (getter).
set - установить
get - получить, взять
Setter - здесь происходит проверка на валидность входных данных. К примеру, возраст не может быть отрицательным числом. Добавим условие проверки.
Getter - просто возвращаем данные.
p.setAge(-5); - не пройдет проверку и m_age станет 0.
p.getAge(); - вернет нам 0.
Этот вариант setter`а ничего не возвращает. Но можно сделать любой тип, чтобы контролировать ошибки и реагировать на них.
3. const и getter
const - может быть, может не быть. Это ключевое слово накладывает запрет на изменение членов класса внутри этого метода (любых, неважно какой модификатор доступа - public или private). Ниже пример.
Добавим переменную m_testVar в private секцию.
Пробуем изменить ее в getter.
Изменить не получится, даже если мы перенесем эту переменную в public секцию. Получим эту же ошибку.
Ещё раз. Внутри этого геттера с const - нельзя поменять члены класса. Только чтение.
Если внутри этого геттера с const создать локальную переменную - то ее можно менять, const распространяется только на члены класса.
4. setter и возвращаемое значение
Если при попытке установить значение в переменную мы можем получить код ошибки, то мы можем этим пользоваться.
При использовании setter в C++ целесообразно возвращать код ошибки или статус выполнения, чтобы контролировать корректность входных данных.
Например, если пользователь не ввёл данные или ввёл их некорректно, метод setter может вернуть специальные коды ошибок (-100, -2000 и т.д.).
Это улучшает обработку ошибок.
Например, в визуальной форме будет гореть красное окошко для пользователя или будет всплывающая подсказка для правильных действий.
Это полезно и в логировании - смотреть файл по шагам, действия, которые закончились кодом ошибки.
Итоги: почему setter и getter в C++ и Qt - обязательны для качественного кода
- Setter — метод для безопасной установки значений переменной, обычно с проверками входных данных.
- Getter — метод, который возвращает значение переменной.
- private - переменные обычно делают private, чтобы защитить данные.
- Использование getter и setter — обычная практика инкапсуляции.
В проекте несколько веток:
- master: setter возвращает код ошибки
- 1_class_person_without_setter: проблема отсутствия setter и getter
- 2_class_person_setter_getter: setter не возвращает код ошибки
- 3_setter_getter_second_way: то же, что и master - setter возвращает код ошибки