Другие языки программирования и технологии

Агрегация объектов. С++

Теперь, более или менее разобравшийся в определениях... Стало интересно как в с++ реализуется агрегация? До сегодняшнего дня я видел у всех только композицию, при котором объект композитор живет внутри класса. Это все просто, но вот агрегация гласит, что объект агрегатор может жить и после смерти объекта в который он заточен. Но как это реализовывается?
Как сделать зависимость агрегатора и отдельного объекта не помещая при этом внешний объект над классов ибо это унылое гг получается.... Мне бы как то сослаться именно на адрес, что бы при изменении внешнего менялся и агрегат и наоборот при изменении агрегата менялся и внешний объект и всегда они были бы равны между собой. А после смерти агрегатора бы внешний объект попросту продолжил существовать. У меня идеи иссякли экспериментировать...
Олег Кабин
Олег Кабин
10 755
Прочитай https://habr.com/ru/post/354046/ - там очень доходчиво.

Композиция - когда "внутренний" объект создаётся вместе с "внешним" - как составная часть "внешнего" объекта.

А агрегация - когда "внутренний" объект - это отдельная сущность, которая создаётся в совершенно другом месте и передаётся в готовом виде в конструктор "внешнего" объекта в качестве параметра.

Например, несколько классов, логирующих свои действия, получают - как параметр своих конструкторов - один и тот же экземпляр логера.

Агрегация - это основа работы контейнеров внедрения зависимостей в языках с поддержкой рефлексии.
Егор Шашков
Егор Шашков
80 885
Лучший ответ
Олег Кабин Да я читал. Я это все довольно неплохо понял. Там также сказано что после смерти агрегатора, объект который передавался ранее продолжает существовать. Подразумевается что они не отдельно существуют а зависят друг от друга в течении жизни и после смерти передаваемый ранее объект будет иметь теже значения что и агрегатор на момент смерти
Олег Кабин P.S эту статью я тоже читал неоднократно
Олег Кабин P.S. Пример приведенный на портале не делает 2 объекта зависимыми между собой. они не живут синхронно. и при уничтожении класса агрегирующего объект - внешний объект не возьмет примет свойства того объекта который умер
Петр Годуненко Можно создать динамический объект внутри объекта-контейнера, но не удалять его вызовом delete. Главное сохранить на него указатель, прежде чем удалить контейнер)) Скользко, но можно) И это также будет агрегирование.
#include <iostream>
using namespace std;
struct Point {
Point() : x(0), y(0) {}
Point(double _x, double _y) : x(_x), y(_y) {}
double x;
double y;
pair<double, double> get()const {
return { x, y };
}
};
class Segment {
public:
~Segment() = default;
Segment(Point& a, Point& b) : a_(a), b_(b) {}
double lehgth()const {
return sqrt(pow(a_.x - b_.x, 2) + pow(a_.y - b_.y, 2));
}
private:
Point& a_; // Агрегирование
Point& b_; // Агрегирование
};
int main() {
Point a(7, 3);
Point b(9, 5);
Segment seg(a, b);
auto lehgth = seg.lehgth();
seg.~Segment(); // Контейнер умер
auto[ax, ay] = a.get(); // Объект контейнера жив
auto[bx, by] = b.get(); // Объект контейнера жив
cout
<< "a: { " << ax << ", " << ay << " }\n"
<< "b: { " << bx << ", " << by << " }\n"
<< "Length: " << lehgth << '\n';
system("pause");
}