Array vom Typ einer Abstrakten Basisklasse?
-
Ich hatte vor einer Weile mal ein Array eines bestimmten Typs deklariert, dass dann mit Objekten der abgeleiteten Klassen dieses Typs gefüllt wurde. Dazu war aber natürlich erstmal eine Zeile wie "Basisklasse *array = new Basisklasse[laenge]" nötig, bevor ich Sachen wie "array[pos] = new Subklasse()" machen konnte.
Jetzt versuche ich ähnliches gerade mit einer Abstrakten Basisklasse (also mit pure virtual functions) zu machen, aber wie zu erwarten war, geht das natürlich nicht so ohne weiteres, weil man ABCs nicht instanzieren kann.
Die Frage also: Kann ich auch mit einer solchen abstrakten Klasse als Basisklasse irgendwie ein Array aufmachen, dass ich dann mit nicht-abstrakten abgeleiteten Klassen füllen kann? Das will ich nämlich im Endeffekt tun.
-
Nabend/Nacht,
Du musst dafür ein Array von Zeigern auf die abstrakte Basisklasse erstellen:
AbstrakteKlasse **array = new AbstrakteKlasse[num]; array[0] = new AbgeleiteteKlasse(); //Alternativ mit std::vector std::vector<AbstrakteKlasse *> array; array.push_back(new AbgeleiteteKlasse());Ungetestet, hoffe das stimmt so.
KaPtainCugel
EDIT: underscore bei push_back vergessen
-
Ein Pointer-Container ist für gewöhnlich die beste Lösung.
-
KPC schrieb:
Nabend/Nacht,
Du musst dafür ein Array von Zeigern auf die abstrakte Basisklasse erstellen:
AbstrakteKlasse **array = new AbstrakteKlasse[num]; array[0] = new AbgeleiteteKlasse(); //Alternativ mit std::vector std::vector<AbstrakteKlasse *> array; array.push_back(new AbgeleiteteKlasse());Ungetestet, hoffe das stimmt so.
KaPtainCugel
EDIT: underscore bei push_back vergessen
Du hast beim 1. new ein Sternchen vergessen.
-
son gemüse ist die ausnahme, für die ich folgende konstrukte mag:
typedef AbstrakteKlasse* AbstrakteKlassePtr; // ... AbstrakteKlassePtr* pp = new AbstrakteKlassePtr[50]; pp[0] = new KonkreteKlasse;kann gefährlich sein, wenn man mit solchen typedefs arbeitet (da ist schnell mal ein delete vergessen), aber wenn man mit pointern auf pointer arbeitet erhöht sowas häufig die lesbarkeit.
-
Ich hab jetzt sowas in der folgenden Form benutzt:
class Klasse { public: AbstrakteKlasse **array: void eineMethode() { array = *new AbstrakteKlasse[1]; array[0] = new AbgeleiteteKlasse(); } };Das müsste also den Vorschlägen entsprechen. Trotzdem bekomme ich nach wie vor
error C2259: 'AbstrakteKlasse' : cannot instantiate abstract classLiegt der Fehler woanders, oder hab ich hier eine Kleinigkeit übersehen?
EDIT: Stimmt, hab eine Kleinigkeit übersehen. Das * war natürlich völlig falsch gesetzt. Es muss ja schließlich "array = new AbstrakteKlasse*[1];" heißen. Da hab ich wohl zu lange mit dem zeigerlosen Java programmiert.
