Теперь, более или менее разобравшийся в определениях... Стало интересно как в с++ реализуется агрегация? До сегодняшнего дня я видел у всех только композицию, при котором объект композитор живет внутри класса. Это все просто, но вот агрегация гласит, что объект агрегатор может жить и после смерти объекта в который он заточен. Но как это реализовывается?
Как сделать зависимость агрегатора и отдельного объекта не помещая при этом внешний объект над классов ибо это унылое гг получается.... Мне бы как то сослаться именно на адрес, что бы при изменении внешнего менялся и агрегат и наоборот при изменении агрегата менялся и внешний объект и всегда они были бы равны между собой. А после смерти агрегатора бы внешний объект попросту продолжил существовать. У меня идеи иссякли экспериментировать...
Другие языки программирования и технологии
Агрегация объектов. С++
Прочитай https://habr.com/ru/post/354046/ - там очень доходчиво.
Композиция - когда "внутренний" объект создаётся вместе с "внешним" - как составная часть "внешнего" объекта.
А агрегация - когда "внутренний" объект - это отдельная сущность, которая создаётся в совершенно другом месте и передаётся в готовом виде в конструктор "внешнего" объекта в качестве параметра.
Например, несколько классов, логирующих свои действия, получают - как параметр своих конструкторов - один и тот же экземпляр логера.
Агрегация - это основа работы контейнеров внедрения зависимостей в языках с поддержкой рефлексии.
Композиция - когда "внутренний" объект создаётся вместе с "внешним" - как составная часть "внешнего" объекта.
А агрегация - когда "внутренний" объект - это отдельная сущность, которая создаётся в совершенно другом месте и передаётся в готовом виде в конструктор "внешнего" объекта в качестве параметра.
Например, несколько классов, логирующих свои действия, получают - как параметр своих конструкторов - один и тот же экземпляр логера.
Агрегация - это основа работы контейнеров внедрения зависимостей в языках с поддержкой рефлексии.
Олег Кабин
Да я читал. Я это все довольно неплохо понял. Там также сказано что после смерти агрегатора, объект который передавался ранее продолжает существовать. Подразумевается что они не отдельно существуют а зависят друг от друга в течении жизни и после смерти передаваемый ранее объект будет иметь теже значения что и агрегатор на момент смерти
Олег Кабин
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");
}
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");
}
Похожие вопросы
- Экземпляра класса, объекты
- рисующие цифровые картины, подскажите как экспортируете объекты из Corel в Photoshop?
- Покраска 3д объекта в bleder или photoshop
- Delphi:Прочитал, что если при динамическом создании компонента если указать Name объекта, то в последующем можно ->
- Что такое объект в программировании?
- СРОЧНО !!!ВЫРУЧАЙТЕ !!!Как в Photoshop уменьшить размер фото , СОХРАНИВ ПРИ ЭТОМ ПРОПОРЦИИ ОБЪЕКТА НА ФОТО!!!
- JS-программеры! подскажите пожалуйста код для перемещения объекта курсором мыши.
- ООП в PHP (взаимодействие между объектами)
- программно создать объект в C#
- 3d объект на каком либо языке программирования