it-swarm.com.de

C ++: Assoziation, Aggregation und Zusammensetzung

Ich fange an, OOAD zu lernen und habe Schwierigkeiten, ein C++ Codebeispiel, das veranschaulichen würde, wie Association, Aggregation und Composition programmgesteuert implementiert werden. (Es gibt überall mehrere Beiträge, die sich jedoch auf C # oder Java beziehen.) Ich habe ein oder zwei Beispiele gefunden, aber alle widersprechen den Anweisungen meines Lehrers und ich bin verwirrt.

Mein Verständnis ist das in:

  • Association : Foo hat einen Zeiger auf das Bar-Objekt als Datenelement
  • Aggregation : Foo hat einen Zeiger auf das Bar-Objekt und die Daten von Bar werden tief in diesen Zeiger kopiert.
  • Zusammensetzung : Foo hat ein Bar-Objekt als Datenelement.

Und so habe ich es implementiert:

//ASSOCIATION
class Bar
{
    Baz baz;
};
class Foo
{
    Bar* bar;
    void setBar(Bar* _bar)
    {
        bar=_bar;
    }
};

//AGGREGATION
class Bar
{
    Baz baz;
};
class Foo
{
    Bar* bar;
    void setBar(Bar* _bar)
    {
        bar = new Bar;
        bar->baz=_bar->baz;
    }
};


//COMPOSTION
class Bar
{
    Baz baz;
};
class Foo
{
    Bar bar;
    Foo(Baz baz)
    {
        bar.baz=baz;
    }
};

Ist das richtig? Wenn nicht, wie soll es stattdessen gemacht werden? Es wäre dankbar, wenn Sie mir auch eine Referenz eines Codes aus einem Buch geben würden (damit ich mit meinem Lehrer darüber diskutieren kann).

5
Talha5389

Es gibt mehrere Möglichkeiten, die OO Konzepte der Assoziation , Aggregation und Zusammensetzung zu C++ - Code. Dies gilt insbesondere für Aggregation , weil es nicht einmal einen Konsens gibt, was es genau bedeutet.

Ihre Zuordnung schlägt die folgende Semantik vor, die nicht falsch ist:

  • Association: Foo hat einen Zeiger auf das Bar-Objekt als Datenelement, ohne das Bar-Objekt zu verwalten -> Foo kennt Bar
  • Zusammensetzung: Foo hat ein Balkenobjekt als Datenelement -> Foo enthält einen Balken. Es kann nicht ohne es existieren.
  • Aggregation: Foo hat einen Zeiger auf das Balkenobjekt und verwaltet die Lebensdauer dieses Objekts -> Foo enthält einen Balken, kann aber auch ohne diesen existieren.

Wie bereits erwähnt, ist die Aggregation hier schwierig, da selbst innerhalb von UML die Bedeutung der Aggregation nicht kristallklar ist. Eine andere mögliche Bedeutung der Aggregation ist "Foo enthält ein Balkenobjekt, das mit anderen Objekten geteilt wird." Dies wird normalerweise in C++ - Code durch std::shared_pointer Oder boost::shared_pointer Dargestellt.
Welche Bedeutung Ihr Ausbilder der Aggregation beimisst, muss mit ihm besprochen werden.