object aggregation
Főnév
object aggregation (tsz. object aggregations)
- (informatika) Az object aggregation (objektum aggregáció) a C++-ban (és általában az objektum-orientált programozásban) egy kompozíciós kapcsolat, amely során egy objektum (általában egy osztály példánya) egy másik objektum példányát nem saját maga hozza létre, hanem készen kapja példányosítva – jellemzően paraméterként.
Ez a fajta kapcsolat „has-a” (birtokolja) viszony, és gyakran az összetett objektumokat leíró modellekben használatos.
🧱 Aggregáció lényege
- Laza kapcsolat két objektum között: az aggregált objektum nem szűnik meg automatikusan, ha az aggregáló objektum megszűnik.
- Az aggregált objektum életciklusa független az aggregálótól.
- A kapcsolódás általában hivatkozással vagy pointerrel történik, nem tagváltozóként való példányosítással.
- Az aggregált objektumot kívülről adjuk át (konstruktorban vagy setterrel).
📌 Példa: Aggregáció a gyakorlatban
#include <iostream>
using namespace std;
class Engine {
public:
void start() const {
cout << "Engine starting..." << endl;
}
};
class Car {
private:
Engine* engine; // Aggregáció: nem példányosítja saját maga
public:
Car(Engine* e) : engine(e) {}
void start() const {
cout << "Car starting..." << endl;
engine->start();
}
};
int main() {
Engine e; // Kívül hozzuk létre
Car c(&e); // Átadjuk a referenciát
c.start(); // Mindkettő működik
}
Ebben a példában:
- Az
Engineobjektum életciklusa nem aCar-hoz kötött. - Ha a
Carpéldány megszűnik, azEnginenem törlődik automatikusan. - Ez aggregáció, nem kompozíció.
⚖ Aggregáció vs Kompozíció
| Tulajdonság | Aggregáció | Kompozíció |
|---|---|---|
| Példányosítás | Kívülről kapott | Osztályon belül példányosított |
| Életciklus | Független | Függő (ha a „gazda” meghal, ő is) |
| Megvalósítás | Pointer vagy referencia | Tagváltozóként, automatikus példány |
| Kódviselkedés | „has-a” kapcsolat, de laza | „owns-a” kapcsolat, erősebb kötés |
🎯 Mikor használd az aggregációt?
- Ha az egyik objektum több másik objektum által is használt lehet.
- Ha nem akarsz felelősséget vállalni az objektum példányosításáért vagy törléséért.
- Ha az objektum nem része szervesen a gazda belső állapotának, de együtt dolgozik vele.
🛑 Veszélyek, amire figyelni kell
- Érvénytelen mutató: ha az aggregált objektumot törlik a gazda életciklusa alatt.
- Nem egyértelmű tulajdonviszony: ha több gazda használja ugyanazt a példányt.
- Memóriaszivárgás: ha nem világos, kinek kell felszabadítani az objektumot.
🔁 Aggregáció referencia típusban
class Car {
Engine& engine; // referencia aggregáció
public:
Car(Engine& e) : engine(e) {}
void start() { engine.start(); }
};
Ez még biztonságosabb, mert a referencia mindig érvényes kell legyen, és nem lehet nullptr.
📦 Aggregáció STL konténerrel
class University {
vector<Student*> students; // Aggregált diákok
public:
void addStudent(Student* s) {
students.push_back(s);
}
void list() const {
for (auto s : students)
s->print();
}
};
A University nem birtokolja a diákokat, csak hivatkozik rájuk. Ha egy Student példány megszűnik, a University példánynak érvénytelen hivatkozásai lehetnek.
👩💻 Modern megközelítés: shared_ptr aggregációra
#include <memory>
using namespace std;
class Car {
shared_ptr<Engine> engine;
public:
Car(shared_ptr<Engine> e) : engine(e) {}
void start() { engine->start(); }
};
Ez megoldja az életciklus problémát, mert a shared_ptr automatikusan számon tartja, hányan használják.
🧠 Összegzés
Az aggregáció egy laza kapcsolat két objektum között, ahol az egyik külső objektum példányát használja, de nem birtokolja. Hasznos, ha:
- újrahasznosítható objektumokat akarsz kezelni,
- vagy külön életciklusú elemeket akarsz összekapcsolni.
De óvatosan kell vele bánni: az aggregált objektum életciklusa a program többi részén is múlhat, így a memóriakezelés és érvényesség a hívó felelőssége.
- object aggregation - Szótár.net (en-hu)
- object aggregation - Sztaki (en-hu)
- object aggregation - Merriam–Webster
- object aggregation - Cambridge
- object aggregation - WordNet
- object aggregation - Яндекс (en-ru)
- object aggregation - Google (en-hu)
- object aggregation - Wikidata
- object aggregation - Wikipédia (angol)