Ассоциация, агрегация и композиция в C++ с примерами

В C++ ассоциация, агрегация и композиция — это три разных типа отношений между классами или объектами. Я предоставлю краткое объяснение каждой концепции вместе с примером для лучшего понимания.

  1. Ассоциация:
    Ассоциация представляет собой связь между двумя или более классами, при которой объекты одного класса связаны с объектами другого класса. Это слабосвязанные отношения, означающие, что объекты могут существовать независимо друг от друга. Связанные объекты могут иметь двунаправленное или однонаправленное соединение.

Пример.
Рассмотрим два класса: «Учитель» и «Ученик». Класс «Учитель» может иметь список связанных с ним учеников. Аналогично, класс Student может иметь ссылку на учителя, который его обучает. Это представляет собой связь между двумя классами.

class Teacher {
    // ...
};
class Student {
    Teacher* teacher;
    // ...
};
  1. Агрегация.
    Агрегация — это специализированная форма ассоциации, где один класс является «целым», а другой класс — «частью». Он представляет собой слабую связь «имеет», когда часть (объект) может существовать независимо от целого. При агрегировании часть может быть разделена между несколькими целыми.

Пример.
Рассмотрим два класса: «Отдел» и «Сотрудник». Класс Department может иметь несколько сотрудников, но сотрудники могут существовать независимо от отдела.

class Employee {
    // ...
};
class Department {
    vector<Employee*> employees;
    // ...
};
  1. Композиция.
    Композиция — это более сильная форма агрегации, при которой часть (объект) не может существовать независимо от целого. Он представляет собой отношение «содержит», где целое управляет жизненным циклом части. Если уничтожается целое, уничтожаются и все его части.

Пример.
Рассмотрим два класса: «Автомобиль» и «Двигатель». Автомобиль состоит из двигателя, а двигатель является неотъемлемой частью автомобиля. Если Автомобиль уничтожен, Двигатель также уничтожается.

class Engine {
    // ...
};
class Car {
    Engine engine;
    // ...
};