Menu
Coddy logo textTech

Встраивание структур

Часть раздела Объектно-ориентированное программирование путешествия по 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, мы открываем мощные методы, которые рассмотрим в следующих уроках.

challenge icon

Задание

Легко

Давайте создадим простую систему управления сотрудниками, демонстрирующую встраивание структур: основу наследования в 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;
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Объектно-ориентированное программирование

Потренируйтесь самостоятельно: Онлайн-компилятор C