Wie funktioniert das mit dynamische Allokation bei Objekten?
-
Hallo!
Ich möchte eine starke Aggregation als Verbindung zwischen zwei Klassen benutzen.
class Testklasse1 { private: Testklasse2 test; } class Testklasse2 { ... }
Muss ich jetzt in irgendeiner Methode der Testklasse1 auch noch die Klasse instanzieren?
Also
test = new Testklasse2;
oder wird der Speicher bei der Deklaration schon reserviert?
Wenn ich eine schwache Aggregation haben möchte, dann müsste ich folgendes codieren, oder?
[cpp]
class Testklasse1 {
private:
Testklasse2 ***** test;
}class Testklasse2 {
...
}
[/cpp]
-
Dax schrieb:
Muss ich jetzt in irgendeiner Methode der Testklasse1 auch noch die Klasse instanzieren?
Normalerweise geschieht das im Konstruktor der Klasse Testklasse1.
Entweder explizit durch dich per Initialisierungsliste, oder wenn du es nicht explizit machen willst macht der Compiler es für dich, indem er den Standardkonstruktor der Klasse Testklasse2 für das Objekt test aufruft.
class Testklasse1 { private: Testklasse2 test; } Testklasse1::Testklasse1() : test(4) // würde einen Konstruktor von Testklasse2 aufrufen der // ein int als Parameter akzeptiert, falls so ein Konstruktor existiert // lässt du den Eintrag hier in der Initialisierungsliste weg // ruft der Compiler den Standardkonstruktor für test auf und es // ist dadurch initialisiert {}
Das hier
test = new Testklasse2;
geht gar nicht, weil test kein Zeiger ist.
Wo hast du die Einteilung in starke/schwache Aggregation her? Ist mir bisher nicht geläufig. Wie sehen die UML-Symbole dafür aus?
-
Hab ich von da: http://en.wikipedia.org/wiki/Object_composition#Aggregation_in_COM
Ist mir aber eher unklar, warum hier dann der Zeiger verwendet wird bei dem Professor, University etc. Beispiel!
-
Dieser Thread wurde von Moderator/in volkard aus dem Forum C++ in das Forum Rund um die Programmierung verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Tippgeber schrieb:
Wo hast du die Einteilung in starke/schwache Aggregation her? Ist mir bisher nicht geläufig. Wie sehen die UML-Symbole dafür aus?
Ich nehme an, mit starker Aggregation ist Komposition gemeint, d.h. ein Objekt gehört einem einzelnen anderen Objekt.
-
Dax schrieb:
Hallo!
Muss ich jetzt in irgendeiner Methode der Testklasse1 auch noch die Klasse instanzieren?class Testklasse1 { private: Testklasse2 test; } class Testklasse2 { ... }
Also
test = new Testklasse2;
Nein. Die Instanz wird automatisch erzeugt, wenn du ein Objekt von Testklasse1 anlegst. Wenn du aber die Instanz von Testklasse2 mit anderen Werten initialisieren möchtest, dann musst du dies im Konstruktor von Testklasse1 oder in der Initialisierungsliste machen. siehe Tipp von Tippgeber
Bei der Aggregation musst du Testklasse2 selbst instanzieren (Konstruktor oder Initialisierungsliste). Beispiel:
class Testklasse1 { private: Testklasse2* test; public: Testklasse1() { // instanz im Konstruktor anlegen test = new Testklasse1; } ~Testklasse1() { // löschen nicht vergessen delete test; } }
EDIT:
Ich denke das die starke die Komposition und die schwache Aggregation die "richtige" Aggregation ist.