Systemdynamik und Simulationsanalyse -> 3 unterschiedliche Klassen in 1 Array?
-
kingruedi schrieb:
alle Klassen von einer gemeinsammen Basis Klasse ableiten.
Was ich ja eigentlich tue.
-> Typen Klasse
-> Gras
-> Hase
-> FuchsAber das Problem besteht ja darin, dass ich ja nicht die Basis Klasse ableite, sondern noch einmal Ableitungen von den Ableitungen der Basis Klasse erstelle.
D.h.:
Basis Klasse -> Fuchs Klasse -> Objekt der Fuchs Klasse (Fuchs1, Fuchs2, etc.) -> Sollen in Array gespeichert werden (Zugriff über MyArray[i] ... )
Ergebnis: Alle Objekte der Pflanze/Tier-Klassen sollen auf dem Feld angezeigt werden (Auslesen aus dem Array).
-
ich versteh dein problem nicht
struct objekt_fuers_feld { virtual void malen() const =0; }; class hase : public objekt_fuers_feld { //... public: void malen() const; bool tot() const; //... }; class gras : public objekt_fuers_feld { //... public: void malen() const; void wachse(); bool vertrocknet() const; //... }; class feld { std::vector<objekt_fuers_feld*> feld; public: void put(objekt_fuers_feld &obj) { feld.push_back(&obj); } void male_alle() { for(std::vector<objekt_fuers_feld*>::const_iterator i=feld.begin(); i!=feld.end(); ++i) i->male(); } }; int main() { gras gras1(); feld.put(gras1); }
so ungefähr
-
kingruedi schrieb:
ich versteh dein problem nicht
Mein Problem ist, oder besser gesagt war, dass ich nicht wusste, ob ich ein Array mit unterschiedlichen Klassen (bzw. deren Objekten) füllen kann. Aber du hast ja so eben das Gegenteil bewiesen.
Danke. Für weitere Anmerkungen zu meinem Projekt bin ich natürlich offen.
-
Ich bin's nochmal.
Ich habe noch nicht viel Erfahrung mit Containern und so habe ich mich gleich in die Literatur gestürzt. Leider sind meine Bücher beim Thema Vektor-Container nicht sehr ausführlich.
Dein Beispiel habe ich im Großen und Ganzen verstanden, ich will es aber trotzdem noch einmal rekapitulieren.
Ich habe 2 Klassen, nämlich Gras und Hase. Diese habe verschiedene Variablen und Funktionen. Sie gehören zur Struktur "objekt_fuers_feld".
Dann haben wir da noch die Klasse "feld", welche einen Vektor-Container besitzt (zufälliger Weise auch mit dem Namen "feld", aber dass ist ja jetzt erst einmal egal). In diesem Vektor werden Instanzen des Typs "objekt_fuers_feld" gespeichert.
Aber warum steht da hinter ein "*"? Es handelt sich hierbei doch um einen Verweis-Operator, aber warum?Mit dem const_iterator wird auf eine bestimmte Stelle im Vektor zugegriffen (i).
Danach werden mit "i->malen()" Objekte in den Vektor eingetragen, nämlich die Funktion zum zeichnen.Und da kann ich nicht mehr folgen.
1. Gibt mein Compiler da einen Fehler aus ("Der linke Teil von '->malen' muss auf Klasse/Struktur/Union zeigen").
2. Will ich doch eigentlich die Instanzen der verschiedenen Klassen im Vektor haben.
Dazu habe ich ein Bild zu Darstellung gezeichnet:
http://red-angel.i-networx.de/01.gifEs wäre wirklich nett und klasse, wenn du mir da noch den ein oder andere Tipp geben könntest, weil weder meine Bücher noch Google da sehr ergibig sind und das ganze etwas Neuland für mich ist.
Danke im Voraus.
-
Anonymous Guy schrieb:
Aber warum steht da hinter ein "*"? Es handelt sich hierbei doch um einen Verweis-Operator, aber warum?
der stern hat mehrere bedeutungen. abgesehen von der plutimikation ist er manchmal ein operator, der sagt, wohin ein zeiger verweist und manchmal macht er nen typen zum zeigertyp. in deklarationen macht er nen zeiger. das ist hier ein wenig der fall.
und das ist auch der trick am array. währen die einzelnen typen Scahf, Wolf und so ja unterschiedlich groß sein können, und deshalb nicht in ein gemeinsames Array passen, kann man zeiger auf den kram prima in nem gemeinsamen array speichern. zeiger sind ja alle gleich groß. und praktischerweise kann man in c++ sogar ohne tricks nen zeiger auf die basisklasse nehmen und die adresse eines objektes einer abjeleiteten klasse reinstecken. und das ist hier gemacht worden. ist übrigens die lehrbuchlösung für dein problem.
-
volkard schrieb:
kann man zeiger auf den kram prima in nem gemeinsamen array speichern.
D.h., ich speichere lediglich die Pointer im Vektor? Wenn sich aber die Instanz nicht im Vektor befindet, müsste ich sie doch auch ohne Vektor ansprechen können, oder? Schließlich müssen die Instanzen ja irgendwo rumkullern und im Vektor sind sie ja anscheinend nicht.
Um auf das Beispiel zurück zu kommen: Kann ich mir mit z.B. MeinVektor[i].GetName() den Namen der Instanz die sich im Vektor bei i befindet, ausgeben lassen (z.B. Hase, Fuchs, Schaf etc.)?
-
Anonymous Guy schrieb:
D.h., ich speichere lediglich die Pointer im Vektor? Wenn sich aber die Instanz nicht im Vektor befindet, müsste ich sie doch auch ohne Vektor ansprechen können, oder? Schließlich müssen die Instanzen ja irgendwo rumkullern und im Vektor sind sie ja anscheinend nicht.
Die Objekte liegen im RAM - im Vector hast du Zeiger auf diese Objekte.
Um auf das Beispiel zurück zu kommen: Kann ich mir mit z.B. MeinVektor[i].GetName() den Namen der Instanz die sich im Vektor bei i befindet, ausgeben lassen (z.B. Hase, Fuchs, Schaf etc.)?
Nein. Du musst Zeiger verwenden, da es sonst mit Polymorphie nicht gut klappen wird (Stichwort: slicing) - siehe dein Lieblings C++ Buch.
Du musst also Zeiger speichern, was dazu führt, dass du
Vector[i]->getName();
schreiben musst.
-
Shade Of Mine schrieb:
Die Objekte liegen im RAM - im Vector hast du Zeiger auf diese Objekte.
Die Frage hätte ich mir auch selber beantworten können.
Shade Of Mine schrieb:
Nein. Du musst Zeiger verwenden, da es sonst mit Polymorphie nicht gut klappen wird (Stichwort: slicing) - siehe dein Lieblings C++ Buch.
Du musst also Zeiger speichern, was dazu führt, dass du
Vector[i]->getName();
schreiben musst.Also hattest du mich von Anfang an richtig verstanden und es ist damit möglich, Instanzen von verschiedenen Klassen in einem Vector zu speichern und auf diese zuzugreifen?
Wenn das der Fall ist, bedanke ich mich erst einmal bei allen.
Denn Rest kriege ich mit etwas Eigeninitiative schon hin.Nettes Forum habt ihr hier.
-
Anonymous Guy schrieb:
Bei diesem Räuber-Beute-Modell gibt es 3 Typen: Gras, Hase, Fuchs.
Verzeiht die Werbung (*Lüge*), aber bei genau diesem Beispiel muß ich natürlich grinsen und ganz frech auf http://www.c-plusplus.net/titelanzeige.php?ISBN=3826629841 verweisen, wo ich in einem eigenen Kapitel genau so ein Räuber-Beute-Modell programmiere und dabei ganz ähnliche Klassen vorkommen.
-
Marc++us schrieb:
Anonymous Guy schrieb:
Bei diesem Räuber-Beute-Modell gibt es 3 Typen: Gras, Hase, Fuchs.
Verzeiht die Werbung (*Lüge*), aber bei genau diesem Beispiel muß ich natürlich grinsen und ganz frech auf http://www.c-plusplus.net/titelanzeige.php?ISBN=3826629841 verweisen, wo ich in einem eigenen Kapitel genau so ein Räuber-Beute-Modell programmiere und dabei ganz ähnliche Klassen vorkommen.
Warum hast du das nicht gleich gesagt?
Bist du der Verkäufer bei Amazon.de, der ein gebrauchtes Exemplar für 14,95 EUR anbietet? Wenn ja, wie läuft das ganze bei Amazon denn ab? Ich habe da bis jetzt noch nie von anderen Anbietern bestellt, sondern nur bei Amazon direkt. Wie hoch wären dann da die Versandkosten?
-
Nö, bin ich nicht.
-
er ist der autor nicht der verkeufer (für den fall das du ihn missverstanden hast)
ich habe schon mal ein gebrauchtes buch gekauft und so weit ich mich erinnern kann wird das porto extra gezahlt, amazon ist nur der vermitler der rest leuft zwischen dir und verkeufer
-
Gerard schrieb:
er ist der autor nicht der verkeufer (für den fall das du ihn missverstanden hast)
ich habe schon mal ein gebrauchtes buch gekauft und so weit ich mich erinnern kann wird das porto extra gezahlt, amazon ist nur der vermitler der rest leuft zwischen dir und verkeufer
Ja, ich weiß. Habe mich verguckt gehabt. Jedenfalls werde ich es mir gleich mal bestellen.
Btw: Ist es eigentlich schwer, so ein Buch herausbringen zu lassen? Hattest du da schon ein Script fertig? Oder einen Auftrag seitens des Verlages bekommen? Sagt dir der Verlag, wie viele deiner Bücher schon verkauft wurden?
Nicht das ihr jetzt denkt, dass ich ein Buch schreiben will, ich frage lediglich aus Interesse.
-
ja nein ja ja