Встраивание структур
Часть раздела Объектно-ориентированное программирование путешествия по C на Coddy. Урок 28 из 61.
В объектно-ориентированных языках, таких как C++ или Java, наследование позволяет классу получать свойства родительского класса. В C нет встроенного наследования, но мы можем имитировать его с помощью техники, называемой композицией: размещением одной структуры внутри другой.
Идея проста: если Child нужны все свойства Parent, мы встраиваем структуру Parent в качестве члена Child.
typedef struct {
int id;
char name[50];
} Parent;
typedef struct {
Parent parent; // Встроенная структура
int grade;
} Child;Здесь Child содержит всё, что есть у Parent, а также собственное поле grade. Это композиция: дочерний объект «содержит» родительский, а не «является» родительским, но эффект похож на наследование.
Чтобы получить доступ к членам parent через экземпляр Child, используйте оператор dot дважды:
Child c;
c.parent.id = 101;
c.parent.name[0] = 'A';
c.grade = 5;Этот шаблон формирует основу для построения иерархий типов в C. Встраивая базовую структуру в качестве first member, мы открываем мощные методы, которые рассмотрим в следующих уроках.
Задание
ЛегкоДавайте создадим простую систему управления сотрудниками, демонстрирующую встраивание структур: основу наследования в C.
Вы создадите иерархию, в которой Employee содержит Person. Это отражает принцип работы наследования: сотрудник «является» человеком с дополнительной информацией, связанной с работой. Встраивая структуру Person внутрь Employee, вы получаете все свойства человека, а также поля, специфичные для сотрудника.
Вы организуете код в трех файлах:
types.h: определите здесь обе структуры с защитными макросами. Сначала создайте структуруPersonс двумя полями:name(массив characters из 50 characters) иage(integer). Затем определите структуруEmployee, которая встраиваетPersonв качестве своего первого member и добавляет полеemployee_id(integer).types.c: реализуйте функцию с именемprint_employee, которая принимает указатель наEmployeeи выводит информацию о нем. Получайте доступ к данным встроенного person, используя изученный синтаксис с цепочкой точек и стрелок.main.c: создайте переменнуюEmployee, заполните все ее поля (включая name и age встроенного person) и используйте свою функцию print для отображения информации.
Вы получите три входных значения: name сотрудника (строку), его age (integer) и его employee ID (integer).
Ваша функция print_employee должна вывести информацию о сотруднике в следующем формате:
Employee: Alice
Age: 28
ID: 1001Здесь Alice — это name, 28 — age, а 1001 — employee ID из ваших входных данных.
Не забывайте обращаться к member встроенной структуры через parent member. Например, чтобы добраться до name, сначала нужно пройти через member person.
Попробуйте сами
#include <stdio.h>
#include <string.h>
#include "types.h"
int main() {
// Прочитать ввод
char name[50];
int age;
int employee_id;
fgets(name, 50, stdin);
name[strcspn(name, "\n")] = '\0'; // Удалить символ новой строки
scanf("%d", &age);
scanf("%d", &employee_id);
// TODO: Создать переменную Employee
// TODO: Заполнить имя и возраст вложенного person
// Подсказка: Используйте strcpy для имени, доступ через employee.person.name
// TODO: Установить employee_id
// TODO: Вызвать print_employee с указателем на ваш employee
return 0;
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
1Основы модульного программирования
Заголовочные файлыСтражи включенияИсходные файлыСтатические функцииПовторение: Модульный калькулятор4Инкапсуляция
Концепция непрозрачных указателейОпределение непрозрачных структурГеттеры и сеттерыВалидация в сеттерахИтоги: Секретный ящик2Объекты и методы
Структуры как объектыУказатель 'Self'Константная корректностьУказатель против значенияВспомогательные методыИтоги: Point Manager5Проект: Простой банковский счет
Настройка проектаРеализация счета3Жизненный цикл объекта
Паттерн «Конструктор»Паттерн «Деструктор»Инициализация в стекеГлубокое копированиеПовторение: String Wrapper6Наследование через композицию
Встраивание структурПравило первого элементаДоступ к элементам родителяUpcastingПовторение: Иерархия фигур9Проект: Рисование фигур
Обзор проектаРеализация кругаРеализация прямоугольникаПолиморфное использованиеКонтейнер фигурПотренируйтесь самостоятельно: Онлайн-компилятор C