Instanzen aus einer Methode bilden?

Gustav Gans

Grünschnabel
Hallo zusammen!

Dieses ist mein erster Forumseintrag (grade registriert) :)
Ich habe vor 2 Tagen angefangen mich mit OOP in C++ zu beschäftigen und erstelle stückchenweise mit neu Gelerntem ein kleines Konsolen Strategiespielchen, damit ich alles gleich in der Praxis ausprobieren kann. Als Vorkenntnisse habe ich etwas Erfahrung mit C gemacht (Kontrollstrukturen, Funktionen, Arrays, Strings, Zeiger(naja...) und Strukturen).
Ich habe mit großem Interesse schon lange im Forum nach einem vergleichbaren Problem geschnüffelt, aber leider nichts gefunden. Aber viele sehr gute andere Beiträge!

Zu meinem Problem...
Ich habe eine Klasse "kaserne" und eine Klasse "soldat". Ich möchte nun eine Methode in "kaserne" mit der ich Instanzen aus "soldat" bilden kann.

Mein erster Ansatz für eine solche Methode sah so aus:
Code:
void kaserne::create_soldat()
{
 char tmp[3];
 sprintf(tmp,"%i",soldat_no);
 string no=tmp;
 string typ="soldat";
 soldat (typ + no)(soldat_no, "Soldat", 2, 3, 4, 5);
 soldat_no++;
}

Bei "soldat_no" handelt es sich um eine static int Variable aus der Klasse "kaserne" mit 1 initzialisiert.

Der Compiler (Dev C++ und Codeblocks) spuckt dazu folgende Fehlermeldung aus:
Code:
main.cpp: In member function `void kaserne::create_soldat()':
main.cpp:265: error: no matching function for call to `soldat::soldat(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)'
main.cpp:38: note: candidates are: soldat::soldat(const soldat&)
main.cpp:165: note:                 soldat::soldat(int, std::string, float, float, float, float)
main.cpp:159: note:                 soldat::soldat()
main.cpp:268:1: unterminated comment
make.exe: *** [main.o] Error 1

Nachdem ich nun knapp 10 Stunden recherchiert habe, wurde Folgendes aus der Methode:
Code:
void kaserne::create_soldat()
{
 soldat* einheiten[soldat_no];
 for(int i=0; i<=soldat_no; i++)
 { 
 char tmp[3];
 sprintf(tmp,"%i",soldat_no);
 string no=tmp;
 string typ="soldat";
 einheiten[i]= new soldat(typ + no, "Soldat", 2, 3, 4, 5);
 soldat_no++;
 }
}

Auch hier die gleich Fehlermeldung.
Würde mich auch freuen wenn die Instanzen nicht extra in den Heap geschrieben würden, weil ich den Sinn und Zweck des Heaps noch nicht verstanden habe. Außerdem frage ich mich ob das Array "einheiten[soldat_no]" wirklich sein muss, weil ich befürchte, dass im Stack durch das schrittweise Vergrößern des Feldes Chaos entsteht. Habe das Array auf diese Weise deklariert, weil ich nicht weiß wie viele Soldaten im Spiel erstellt werden.

Hier noch der Rumpf des überladenen Konstrukors der Klasse "soldat" (vielleicht steckt mein Problem ja schon hier?!)
Code:
soldat::soldat(int bezeichnung, string type, float preis, float hp, float schutz, float speed) : einheit(bezeichnung, type, preis, hp, schutz, speed)
{
 cout<<"Soldat wurde ausgebildet"<<endl;
}

Wie man schon sieht handelt es sich bei Soldat um die Kindsklasse von der Klasse "einheit". Die Kaserne ist Kindsklasse von "building".

Der komplette Quelltext ist mit mittlerweile 280 Zeilen wohl zu lang für diesen Post(ist ja schon lang genug). Aber natürlich kann ich andere Teile nachliefern oder auch den ganzen Quelltext.

Vielleicht kann mir jemand bei meinem Problem helfen und Danke fürs durchlesen.
 
Hi.

Das Array welches du in der Funktion erstellst, nützt dir nicht viel, denn wie alle lokalen (automatischen) Variablen wird dieses auch nach Verlassen der Funktion automatisch zerstört. (Da sie auf dem Stack liegen und dieser ständig überschrieben wird...)

Du mußt für die Dauer der Lebenszeit der Kaserne die von ihr erzeugten Soldaten in einer geeigneten Datenstruktur als Membervariable der Klasse speichern. Z.B. in einem std::vector.

Dann mußt du natürlich darauf achten, das beim Erzeugen der Klasse auch die Typen der Argumente mit den Typen der von dir definierten Parameter deiner Konstruktoren übereinstimmen.

C++:
#include <vector>

class kaserne: ... {
private:
  // Soldaten der Kaserne speichern
  std::vector<Soldat>  belegschaft;
...
};

void kaserne::create_soldat() {
  // Soldat anlegen.
  soldat gi_joe(soldat_no++, "Soldat", 2.5, 3, 4.3, 8.9);

  // Soldat zur Belegschaft hinzufügen
  belegschaft.push_back(gi_joe);
}
Gruß

PS: Bitte verwende für deinen Code die entsprechenden Code-Tags! 280 Zeilen Code sind nicht viel, die solltest du ruhig posten, dann sehen wir von du sprichst.
 
Vielen Dank für die schnelle Antwort!
Eigendlich müsste ich ja schon wissen, dass die lokalen Variablen nach dem Block ihre Gültigkeit verlieren:rolleyes:
Muss mich da noch ein bissel reinarbeiten, weil ich die #include<vektor> noch nicht kenne. Aber jetzt kann ich endlich weitermachen:)
 
Zurück