Структуры в С++. Продолжаем знакомиться

Продолжаем знакомиться со структурами. Начало знакомства описано в теме:

Структуры могут содержать внутри себя не только собранные вместе переменные, но и функции. Функции помогают нам взаимодействовать с объектами структуры: заполнить структуру, считать значение из структуры, найти что-то в структуре и т. п.

  • В структурах можно описывать функции

Влепленные в структуру функции использовать иногда намного удобнее, чем чуждые для структуры функции.

Самый стандартный способ взаимодействия со структурой — это задание значений атрибутам и получение значений из атрибутов структуры. Сейчас я покажу код, в котором будут использованы две функции, описанные внутри структуры.

Вообще, использовать присваивание знаком присваивания можно, но нужны дополнительные телодвижения: требуется перегружать операцию =, но многие мои читатели ещё не дошли до перегрузок операций, поэтому считаем, что так нельзя.
Атрибут в написанной структуре только один: x, поэтому код должно быть не очень сложно понять. Мы влияем сейчас только на этот единственный атрибут.
Внутри структуры существует, так сказать, внутренний мир, и все атрибуты внутри структуры внутри этого мира самые обычные переменные, но за пределами структуры эти переменные закрыты границей структуры. Поскольку внутри структуры любые её атрибуты самые обычные переменные (очень напоминают глобальные, но глобальны они только в пределах собственной структуры), то их внутри структуры можно легко использовать в любом месте. Но поскольку они закрыты структурой от внешнего мира, то чтобы получить взаимодействие внешнего мира и скрываемых структурой атрибутов, нам нужен своего рода "посол-посредник". Таким "послом-посредником" может замечательно работать значение, относящееся к функции: параметр, приходящий в функцию или значение, уходящее из функции. Мы можем нагрузить таких "посредников" нужной информацией и информация будет передаваться цепочкой как эстафетная палочка. Функции, используемие для получения информации или установки значений, обычно называют геттерами и сеттерами (от англ. get — получать и set — устанавливать), что стараются обозначить в названиях функций.
В показанном примере атрибут x внутри своей структуры в некотором роде напоминает глобальную переменную, поэтому он легко видим в любой функции той же области, в которой сам находится. Так и получается, что когда мы устанавливали параметр, вовнутрь функции было внедрено значение путём приёма значения из внешнего мира в параметр функции get_x. И внутри функции оказалось видно две сущности: сам параметр функции и атрибут структуры, атрибут x. Поскольку две сущности оказались в одной области, то они легко могут обмениваться информацией. Таким образом x впитывает в себя значение, которое пришло в параметр value. И это вот и есть весь механизм передачи значения в атрибут структуры.
Чтобы отдать значение во внешний мир, можно использовать return, только нужно следить, чтобы тип функции соответствовал отдаваемому из функции значению. В большинстве случаев вы будете видеть именно такой способ. Его, по крайней мере, удобно использовать, если значение какого-атрибута структуры нужно сохранять в перемменные внешнего для структуры мира. Можно бы было не использовать return, а задать параметру функции, отдающей информацию об атрибуте, ссылочный характер. Тогда можно бы было этот параметр изменять внутри внутриструктурной функции, чем можно было напрямую влиять на какой-то объект внешнего мира.

Первое время вы можете использовать наиболее понятный вам способ, но привыкнуть в любом случае придётся к обоим вариантам. Это не относится к структурам, а относится к параметрам функций. Можно и немного иначе, но об этом позднее.
В показанном сейчас варианте смысл в том, что мы моделируем некоторого рода посредничество между внешним миром и миром структуры. Берём посредника, наделяем его информацией и передаём информацию или вовнутрь структуры или вовне.
Перед дальнейшим чтением вам необходимо переварить уже прочитанное, понять. Потому что дальше всё, что в статье будет написано, происходит из этого.
Конечно, структуру, содержащую только один атрибут, использовать если и стоит, то в редком случае. Структуры нужны для более сложных сущностей. И обрабатывать их удобно комплексно. Т. е. если у объекта много атрибутов, то можно создать, например, для заполнения всех атрибутов одну функцию.
Для примера возьмём простую программу, в которой опишем структуру "TFilm".

Какие атрибуты можно задать фильму? Название, жанр, оценка. Нам трёх сейчас хватит. На основе этого и создадим структуру, а структура, сооружённая нами, в свою очередь, станет основой объектам.

Теперь можно манипулировать чуть более сложными объектами, чем совсем в простые, очень удобным способом. Например, если надо создать ещё один объект, то создаётся он также, как и обычная переменная: ему даётся тип, созданная нами структура, имя и поcле мы получаем возможность непринуждённого и несложного управления, что можно понять по показанному примеру.

На самом деле эту созданную нами структуру можно немного развить, перегрузив внутренние функции, чтобы была возможность не только задавать значения посредством клавиатуры, но и, например, прямо из исходного кода.

Одиночные структуры не очень интересны. Чаще используют массивы структур, при этом добавляют дополнительной функциональности. Но для начала нужно научиться писать простенькие структуры, под которые создавать объкты, которыми манипулировать в ходе работы программы.

2 комментария на «“Структуры в С++. Продолжаем знакомиться”»

  1. BeezelKek:

    Дорогой автор,скажите,пожалуйста,почему на последней и пред пред последней картинках с кодом(номера листингов не указаны )’:  ) в заголовках некоторых функций есть звездочки?Они находятся после типов возвращаемых переменных и до названий функций.Зачем они там нужны???Не понимаю.Это вроде и не указатели на функции.там же скобки должны быть.заранее спасибо за ответ,Алексей!Да и за сайт спасибо.Он классный 😀

    • const char* get_genre()
      Чтобы функция отдавала символьную строку, а не один символ, используется тип возвращаемого значения указатель на символьную строку. Это с языка С, когда не было в С++ типа string

      Это не указатели на функции, а тип значения, которое отдаётся функцией. Указатели.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Поиск

 
     

Случайная книга в электронном формате

https://www.litres.ru/robert-s-martin/idealnyy-programmist-kak-stat-professionalom-razrabotki-po/?lfrom=15589587

Последние комментарии

Яндекс.Метрика