[C++] Abstrakte Listen

  • Themenstarter Themenstarter Bgag
  • Beginndatum Beginndatum
B

Bgag

Guten Abend!

Ich habe eine Reihe von Klassen, die von der selben abstrakten C++ Klasse (alle Funktionen virtual) erben. Nun möchte ich mehrere Objekte der verschiedenen abgeleiteten Klassen in einem Vektor, einer Liste oder einem Array ablegen, sodass ich über diese iterieren kann. Zum besseren Verständnis hier noch ein kleines Beispiel.

Wir haben eine abstrakte Basis-Klasse BaseGeom, dir nur eine virtuelle Funktion intersect(Straight s) implementiert. Von dieser Basis-Klasse werden die Klassen Triangle, Sphere und Layer abgeleitet. Es werden zwei Instanzen der Klasse Triangle, drei Instanzen der Klasse Sphere und eine Instanz der Klasse Layer in einer Liste geomObjects<BaseGeom> abgelegt. Nun möchte ich in einer Schleife überprüfen, ob eine Gerade s schneiden.

Code:
for(int i = 0; i < geomObjects.size(); i++) {
   if( geomObjects.get(i).intersect(s) ) {
      std::cout << "Intersection with " << geomObjects.get(i) << std::endl;
   }
}

Hoffe dieses kurze Beispiel macht etwas klarer, wo mein Problem liegt. Wäre euch für Hinweise und Anregungen sehr dankbar.

Liebe Grüße,

Andreas
 
Hi,
ich hoffe ich habe dein Problem richtig verstanden, wenn ja habe ich mal etwas ähnliches in meinem Praktikum gemacht.

Wenn du nun mehrere Objekte erstellt hast die dieselbe Basisklasse besitzen, solltest du eine Liste erstellen am besten die aus der std lib von c.
Dann einfach die Zeiger auf deine Objekte in die Liste einfügen. So und wenn du nun über diese Elemente der Liste iterieren möchtest musst du einen iterator benutzen.

Falls du dazu ein Beispiel brauchst müsste ich mal etwas suchen.

Gruß Jennesta
 
Guten Abend bzw. Morgen!

Danke für deine Antwort. Das klingt doch schon ganz gut. Ein Beispiel wäre allerdings wirklich super. Kann ich denn dann noch auf die Methoden zugreifen, die in den abgeleiteten Klassen dazugekommen sind? Das Problem das ich habe ist eigentlich ganz einfach. Ich möchte über eine Liste von geometrischen Körpern iterieren, die alle die Methode intersect() implementieren. In dieser Methode werden jedoch unterschiedliche Klassenattribute verwendet. Ist ja auch klar.

Liebe Grüsse,

Andreas
 
Das ist ja das Tolle an der Polymorphie: du kannst einen Vektor oder ein Array für die Basisklasse deklarieren, in ihm Objekte abgeleiteter Klassen speichern, und anschließend deren überschriebene Methoden korrekt aufrufen.
Für dein Vorhaben bedeutet das:
  • du kannst ein z.B. Array oder einen vector<BaseGeom> deklarieren
  • in diesem kannst du dann Objekte der abgeleiteten Klassen Triangle, Sphere etc. speichern
  • bei einem Zugriff auf ein Element des Vektors kannst du die überschriebene intersect-Methode aufrufen
  • beim Aufruf wird automatisch die korrekte intersect-Methode für dein Triangle-, Sphere- OderWasAuchImmer-Objekt aktiviert
Beispiel:
C++:
BaseGeom geomObjects[3];
geomObject[0] = new Triangle();
geomObject[1] = new Sphere  ();
geomObject[2] = new Layer   ();
std::cout << "Intersection (Triangle): " << geomObjects[0].intersect(s) << std::endl;
std::cout << "Intersection (Sphere  ): " << geomObjects[1].intersect(s) << std::endl;
std::cout << "Intersection (Layer   ): " << geomObjects[2].intersect(s) << std::endl;
 
Wenn du vorher weißt wieviele dieser Objekte du hast, würde ich auch Vereths Beispiel bevorzugen, weil es auch am einfachsten zu implementieren ist.

Wenn du jedoch eine dynamische Anzahl an Elementen von deiner BaseGeom-Basisklasse hast kommst du um Listen oder Vektoren nicht herum.

Hierfür ein Beispiel aus einer solchen Iteration:
C++:
for(list<BaseGeom*>::iterator itL=Liste.begin(); itL != Liste.end(); itL++) {
	(*itL)->intersect(s);
}

Gruß Jennesta
 
Entschuldigt, dass ich mit meiner Antwort solange gewartet habe. Danke für eure Hilfe. Ich habe das Problem nun mit den Vektoren aus der STL gelöst.

Liebe Grüsse,

Andreas
 
Zurück