Ugrás a tartalomhoz

object aggregation

A Wikiszótárból, a nyitott szótárból


Főnév

object aggregation (tsz. object aggregations)

  1. (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 Engine objektum életciklusa nem a Car-hoz kötött.
  • Ha a Car példány megszűnik, az Engine nem 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.