Voneinander abhängige Klassen
-
Hi,
ich habe ein kleines Problem. Ich habe zwei Klassen. Beide Klassen haben eine Referenz von einem Objekt der jeweiligen anderen Klasse. Beide sind in einer eigenen Header. Beim Compilieren gibt der Compiler dann mehrere Fehlermeldung aus. Ist ja klar er sucht immer nach der jeweils anderen Klasse, die er aber noch nicht übersetzt hat. Kann man das ganze umgehen (z.B. Mithilfe von Makros)?
-
such mal nach Forward Dekleration.
Aber, wenn beide Klassen referenzen aufeinander halten, wie
willst du sie dann jemals erstellen ?Devil
-
jo, aber beide Klassen müssen sich irgendwie kennen. naja, vielleicht suche ich auch nach einer anderen Möglichkeit. thx, ich werde jedenfalls erstmalnach Forward Deklaration suchen.
-
Bilden die zwei Klassen eine Assoziation, Aggregation oder Komposition? Vielleicht geht es mit Zeigern. Die muss man nicht sofort initialisieren.
-
Ein Auto hat ein Lenkrad (1-Komposition), einen Koffer im Kofferraum (0..1-Aggregation, kann ja kein Koffer da sein und der Koffer lebt auch ohne Auto weiter) und 4 Räder (4-Komposition), aber n-Insassen (n <= 5, n-Aggregation), was sich so abbildet:
class Auto
{
private:
Lenkrad m_lenkrad;
Koffer* m_pKoffer; // NULL bei 0, Zeiger bei einem Koffer
Rad m_Rad[4]; // Anzahl fest, Komposition => normales Array
std::vector<Person*> m_Insassen; // Anzahl dynamisch, Objekte leben weiter (Aggregation)
};
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
Komposition, 1 Element Objektinstanz
Komposition, 0..1 Elemente Zeiger auf Objektinstanz, NULL zeigt 0 an
Komposition, n Elemente Array aus Objektinstanzen
Komposition, 0..* Elemente dyn. Array (vector<T>, list<T>) aus ObjektinstanzenListen sind stark darin, an beliebigen Stellen Elemente einzufügen und zu entfernen, dafür kannst du sie nur sequentiell durchlaufen (also nicht bspw. direkt auf das 10. Element zugreifen).
Vektoren dagegen haben diesen Random-Access, dafür ist das Einfügen und Entfernen in der Mitte oder am Anfang extrem ineffizient (am Ende Einfügen (push_back) ist OK)(stammt von Marcus Bäckmann, soweit ich weiß)