Aggregation und Komposition realisieren
-
@operator void
Ich habe das mit der Referenz mal ausprobiert, um die Wartezeit auf die Assoziationsklasse zu verkürzen und bin dabei auf ein Problem gestoßen.
Ich ahbe alles so umgesetzt, wie du es gesagt hattest und meine bestehenden Funktionen (AddKonto usw.) nicht angerührt.Ich habe versucht folgendermaßen den Namen einer Person auszugeben:
cout<<"\n"<<my_person.m_aKonten[0].Besitzer.m_strGetName();
Wie gesagt ist das ein bissel blödes Beispiel, da das so in der Praxis selten benötigt wird, aber mich interessiert es dennoch.
Ich erhalte folgenden Fehler:
error: request for member ` m_strGetName' in `((&my_person) + 8)->std::vector<_Tp, _Alloc>::operator[](unsigned int) [with _Tp = Konto, _Alloc = std::allocator<Konto>](0)->Besitzer', which is of non-aggregate type ` <unknown type>'
Scheint ja irgendwie am vector zu hängen.
Vielen Dank schonmal,
Fingolfin
-
Besitzer**()**?
-
Marc++us schrieb:
Das gab's schon, bevor der Begriff "Design Pattern" eingeführte wurde...
natuerlich.
Design Pattern sind ja keine neue Inovationen, sondern geben den techniken bestimmte Namen.Ich finde es praktisch. Man muss nicht ewig erklaeren was man assoziationsklasse und Zwischenstufe meint, sondern sagt einfach: google mal nach Mediator Pattern
-
<imho>
Genau. Die Patterns sollen weniger Lösungsvorschläge für Designprobleme sein (auch wenn ich sie hauptsächlich so verwende und damit ganz sicher nicht der einzige bin), nach meinem Verständnis ist die Essenz der Design Patterns, Namen für gebräuchliche Praktiken zu finden, damit man darüber kommunizieren kann. Dahinter steckt die Theorie (oder der Wunsch?) dass sich Software aus solchen Mustern zusammensetzt, so dass man diese eigentlich nur alle identifizieren muss, und dann auf einer ganz anderen Ebene über Softwarekonstruktion sprechen kann.
</imho>
-
operator void schrieb:
Besitzer**()**?
Oh Mann, du hast natürlich recht. Das ist jetzt schon das zweite mal, daß ich Stunden mit dem Fehler verbringe. *sichselbstindenhinterntritt
Eine Frage hätte ich dann doch noch (wie immer )
Vorher (also mit Pointern) habe ich das Hinzufügen eines Kontos zu der Person folgendermaßen geregelt:
void Person::AddKonto() { Konto value(this); m_Konten.push_back(value); }
Wie erfolgt das denn jetzt bei den Referenzen? Ich erhalte auf die Art immer:
error: no matching function for call to `Konto::Konto(Person* const)' candidates are: Konto::Konto(const Konto&) error: Konto::Konto(Person&)
Wobei mir der Candidates error gar nix sagt, schließlich habe ich den Konstruktor exakt aus operator voids beispiel übernommen. Der müßte doch wenigstens 'ne Person erwarten und kein Konto.
Vielen Dank schonmal,
Fingolfin
-
(Oh, ich sollte mal besser lesen :))
Du musst this dereferenzieren, weil this ein Pointer und keine Referenz ist (warum auch immer?!).
Der andere Konstruktor ist der automatisch generierte Kopierkonstruktor (siehe Literatur deiner Wahl ).
-
@operator void
Danke aber so ganz bekomme ich anscheinend nie alles hin, was ich versuche. Gibt es nicht ein Tutorial in dem alle Varianten einmal quellcodeseitig gezeigt werden. So wie Marc++us das aufgesclüsselt hat:
Komposition, 1 Element Objektinstanz Komposition, 0..1 Elemente Zeiger auf Objektinstanz, 0 wird durch NULL angezeigt Komposition, n Elemente Array aus Objektinstanzen Komposition, 0..* Elemente dyn. Array (vector<T>, list<T>) aus Objektinstanzen Aggregation, 1 Element Referenz auf Objektinstanz Aggregation, 0..1 Elemente Zeiger auf Objektinstanz, NULL zeigt 0 an Aggregation, n Elemente Array aus Zeigern auf Objektinstanzen Aggregation, 0..* Elemente dyn. Array (vector<T*>, list<T*>) aus Zeigern auf Objektinstanzen
und dann vielleicht mit Beispiel? Ich habe eine ganze Weile nach sowas gesucht, bin aber leider nicht fündig geworden.
Sowas wäre auch mal ein guter Beitrag für die FAQ
Fingolfin
-
Aggregation, 1 Element Referenz auf Objektinstanz
Bitte ein kleines Beispiel.
-
? bitte ?
-
??? gibt es wirklich keines?