Найти в Дзене

Setter и getter tutorial в C++ и Qt : разбор с примерами.

Оглавление

Это небольшое руководство для начинающих специалистов. Быстро освоить setter и getter в C++ и Qt. Просто и без воды. То, что необходимо для старта.

Этот guide касается темы инкапсуляции данных на Cpp.
Хотел бы отметить, что данный материал я использую для своих занятий на предприятии с новыми специалистами в ходе их подготовки.
Поэтому он не является исчерпывающим, просто пример одного нашего занятия.

1. Что не так с переменными в классе?

Нет проверок на ошибки. Доступ не контролируется.
Нет проверок на ошибки. Доступ не контролируется.
  • Нет проверки на ошибки (другой термин: валидность) входных данных.
  • Доступ public: пиши что хочешь, Никто не будет ничего проверять, просто присвоит данные без условий как захочет.
  • При частом использовании этой переменной в коде может сложиться ситуация изменения названия этой переменной. Тогда необходимо найти в коде все все места, чтобы всё поменять. Сто процентов это будет трудозатратно и повлечет за собой ошибки. Так делать нельзя.

Чтобы контролировать данные, делаем переменные private

Секция private не даст доступ напрямую
Секция private не даст доступ напрямую

Теперь нельзя получить доступ к переменной, нет возможности менять её напрямую и случайно испортить данные.

2. Что такое setter и getter в C++ и зачем они нужны?

Теперь сделаем правильно. Нам нужны два метода, чтобы правильно управлять доступом к приватным переменным класса -

  • чтобы ЗАПИСАТЬ данные в эту "переменную" (setter), и
  • чтобы ПРОЧИТАТЬ данные из этой "переменной" (getter).

set - установить

get - получить, взять

person.h
person.h

person.cpp
person.cpp

Setter - здесь происходит проверка на валидность входных данных. К примеру, возраст не может быть отрицательным числом. Добавим условие проверки.

Getter - просто возвращаем данные.

main.cpp
main.cpp

p.setAge(-5); - не пройдет проверку и m_age станет 0.

p.getAge(); - вернет нам 0.

Этот вариант setter`а ничего не возвращает. Но можно сделать любой тип, чтобы контролировать ошибки и реагировать на них.

3. const и getter

const - может быть, может не быть. Это ключевое слово накладывает запрет на изменение членов класса внутри этого метода (любых, неважно какой модификатор доступа - public или private). Ниже пример.

Добавим переменную m_testVar в private секцию.

Добавили переменную m_testVar
Добавили переменную m_testVar

Пробуем изменить ее в getter.

-8

Изменить не получится, даже если мы перенесем эту переменную в public секцию. Получим эту же ошибку.

Ещё раз. Внутри этого геттера с const - нельзя поменять члены класса. Только чтение.

Если внутри этого геттера с const создать локальную переменную - то ее можно менять, const распространяется только на члены класса.

4. setter и возвращаемое значение

Если при попытке установить значение в переменную мы можем получить код ошибки, то мы можем этим пользоваться.

При использовании setter в C++ целесообразно возвращать код ошибки или статус выполнения, чтобы контролировать корректность входных данных.

Например, если пользователь не ввёл данные или ввёл их некорректно, метод setter может вернуть специальные коды ошибок (-100, -2000 и т.д.).
Это улучшает обработку ошибок.

Например, в визуальной форме будет гореть красное окошко для пользователя или будет всплывающая подсказка для правильных действий.

Это полезно и в логировании - смотреть файл по шагам, действия, которые закончились кодом ошибки.

person.h - теперь setter возвращает код ошибки
person.h - теперь setter возвращает код ошибки
person.cpp - возможная реализация
person.cpp - возможная реализация
main.cpp - код ошибки для дальнейшего сценария действий в приложении
main.cpp - код ошибки для дальнейшего сценария действий в приложении

Итоги: почему setter и getter в C++ и Qt - обязательны для качественного кода

  • Setter — метод для безопасной установки значений переменной, обычно с проверками входных данных.
  • Getter — метод, который возвращает значение переменной.
  • private - переменные обычно делают private, чтобы защитить данные.
  • Использование getter и setter — обычная практика инкапсуляции.

Код на GitFlic

В проекте несколько веток:

  • master: setter возвращает код ошибки
  • 1_class_person_without_setter: проблема отсутствия setter и getter
  • 2_class_person_setter_getter: setter не возвращает код ошибки
  • 3_setter_getter_second_way: то же, что и master - setter возвращает код ошибки

Видео Rutube