Objekte nachträglich in abgeleitete Objekte umwandeln
-
Hallo,
für mein Spiel hab ich eine Klasse "einheit" und davon abgeleitet Klassen wie "soldat", "reiter" oder "bogenschütze". Ich würde gern wissen, wie ich es anstellen kann, dass ich zu Programmbeginn z.b. 100 "einheit" objekte anlege und sie später in verschiedene Unterklassen umwandle.
Geht so etwas?
Oder wie könnte ich sonst während das Programm läuft verschiedene von der Benutzereingabe abhängige Objekte erstellen?Danke schonmal!
Gruß Knobbers.
-
Vielleicht hilft dir das Stichwort "Factory-Pattern" weiter.
-
Du erstellst die Objekte während der laufzeit mit new und Speicherst sie z.B. in einem Array von einheit-pointern
-
314159265358979 schrieb:
Vielleicht hilft dir das Stichwort "Factory-Pattern" weiter.
Übertreibst du da nicht ein bisschen? Der Threadersteller ist offensichtlich totaler Anfänger.
@Threadersteller: Da gibt es viele Möglichkeiten. Die Grundfrage ist erst einmal, ob du die Objekte hinterher über ein gemeinsames Interface ansprechen kannst/möchtest oder nicht. Mal angenommen nein:
#include <iostream> #include <vector> using namespace std; class Bogenschuetze { unsigned nummer; public: explicit Bogenschuetze(unsigned nummer): nummer(nummer) {} void schiess() { cout << "Bogenschütze Nummer " << nummer << " schießt.\n"; } }; class Schwertkaempfer { unsigned nummer; public: explicit Schwertkaempfer(unsigned nummer): nummer(nummer) {} void schlag() { cout << "Schwertkämpfer Nummer " << nummer << " schlägt.\n"; } }; int main() { vector<Bogenschuetze> schuetzen; vector<Schwertkaempfer> kaempfer; cout << "b: neuer Bogenschütze\ns: neuer Schwertkämpfer\nk: Kämpfen und Ende\n"; char input; while ((cin >> input) and input != 'k') { if (input=='b') schuetzen.push_back(Bogenschuetze(schuetzen.size()+1)); else if (input=='s') kaempfer.push_back(Schwertkaempfer(kaempfer.size()+1)); } for(unsigned i = 0; i < schuetzen.size(); ++i) schuetzen[i].schiess(); for(unsigned i = 0; i < kaempfer.size(); ++i) kaempfer[i].schlag(); }Und angenommen du brauchst ein gemeinsames Interface:
#include <iostream> #include <vector> using namespace std; class Einheit { unsigned nummer; public: explicit Einheit(unsigned nummer): nummer(nummer) {} virtual void kaempf()=0; virtual ~Einheit() {} unsigned get_nummer() {return nummer;} }; class Bogenschuetze: public Einheit { public: explicit Bogenschuetze(unsigned nummer): Einheit(nummer) {} virtual void kaempf() { cout << "Bogenschütze Nummer " << get_nummer() << " schießt.\n"; } }; class Schwertkaempfer: public Einheit { public: explicit Schwertkaempfer(unsigned nummer): Einheit(nummer) {} virtual void kaempf() { cout << "Schwertkämpfer Nummer " << get_nummer() << " schlägt.\n"; } }; int main() { unsigned num_schuetzen = 0, num_kaempfer = 0; vector<Einheit*> einheiten; cout << "b: neuer Bogenschütze\ns: neuer Schwertkämpfer\nk: Kämpfen und Ende\n"; char input; while ((cin >> input) and input != 'k') { if (input=='b') { einheiten.push_back(new Bogenschuetze(++num_schuetzen)); } else if (input=='s') { einheiten.push_back(new Schwertkaempfer(++num_kaempfer)); } } for(unsigned i = 0; i < einheiten.size(); ++i) einheiten[i]->kaempf(); for(unsigned i = 0; i < einheiten.size(); ++i) delete einheiten[i]; }Insbesondere der zweite Vorschlag hat noch reichlich Verbesserungspotential was die Sicherheit angeht. Man sollte lieber einen Pointercontainer nehmen (der löscht die Elemente automatisch) oder die Elemente so wie in Fall 1 in einem anderen Container speichern und den Zugriff über Zeiger auf diese Elemente organisieren (aber aufpassen, dass die Adressen sich nicht ändern, zum Beispiel bei Vectorreallokationen!).
Oder wenn du die durchgestylte Patentlösung benutzen möchtest, dann Google mal nach Pis Stichwort. Aber dafür solltest du zumindest einigermaßen den Durchblick in den Grundlagen von C++ haben.
-
Objekte nachträglich in abgeleitete Objekte umwandeln
Das geht nicht.
-
knivil schrieb:
Objekte nachträglich in abgeleitete Objekte umwandeln
Das geht nicht.
Ist doch egal, das will er doch eigentlich auch nicht.
-
knivil schrieb:
Objekte nachträglich in abgeleitete Objekte umwandeln
Das geht nicht.
Muss es portierbar sein?

-
Dobi schrieb:
knivil schrieb:
Objekte nachträglich in abgeleitete Objekte umwandeln
Das geht nicht.
Muss es portierbar sein?

Ach Kinder hört doch mit dem Scheiss auf!
-
Knobbers schrieb:
Oder wie könnte ich sonst während das Programm läuft verschiedene von der Benutzereingabe abhängige Objekte erstellen?
Äh.
Kennst du "if", "new", Zeiger und Container (bzw. Arrays tuns auch)?
Falls die Antwort 4x "ja" ist dann verstehe ich dein Problem nicht.
Falls du ein oder mehr "nein" dabei hast, dann ist das dein Problem.
-
Jonas OSDever schrieb:
Du erstellst die Objekte während der laufzeit mit new und Speicherst sie z.B. in einem Array von einheit-pointern
Wie gehts das? Ein abgeleitetes Objekt in einem Vaterklasse-Zeiger speichern?
@seppj: Danke für die viele Mühe, ich werds ausprobieren!
-
Knobbers schrieb:
Jonas OSDever schrieb:
Du erstellst die Objekte während der laufzeit mit new und Speicherst sie z.B. in einem Array von einheit-pointern
Wie gehts das? Ein abgeleitetes Objekt in einem Vaterklasse-Zeiger speichern?
Genau das
