vector<Klassentyp>
-
Hallo zusammen!
Damit der andere Thread nicht unnötig groß wird, mache ich mal nen neuen auf.
Erst mal ein paar Code-Schnipsel:
// c_ship.hpp class c_ship { private: int m_agility; public: // set/get Funktionen c_ship(string s_type); }// c_ship.cpp c_ship::// set/get c_ship::c_ship(string s_type) { if(s_type == "Kreuzer") // Es gibt verschiedene Schiffe. { m_agility = 100; // nur ein Beispiel } // Waffe hinzufügen --> Hier ist das Problem vector<c_weapon> weapon(2); }// c_weapon.hpp class c_weapon { private: int i_damage; public: c_weapon(string s_type); }// c_weapon.cpp // set/get Funktionen c_weapon::c_weapon(string s_type) { // s_type repräsentiert den Waffentyp if(s_type == "Laser") { i_damage = 150; } // ... }Wie man an dem Codeteil sieht, möchte ich in der ship.cpp innerhalb des Konstruktors einen vector der Klasse c_weapon erstellen. Das erstellen ist ja auch kein Problem. Aber wie kann ich da jetzt auf die Memberfunktionen der Klasse c_weapon zugreifen und dem Konstruktor den Typ (s_type) der Waffe übergeben? vector<c_weapon> weapon("Kreuzer"); Ich dachte, dass es so funktionieren müsste, das tut es aber nicht. Und wenn ich "weapon." eingebe, dann greife ich ja nur auf die Funktionen des vectors zu, z.B. push_back(), aber nicht auf die Memberfunktionen der Klasse c_weapon.
Ich hatte hier ein wenig gesucht, aber nicht wirklich was gefunden.
Kann es sein, dass ich einen groben Fehler gemacht habe oder weiß ich einfach nur nicht wie ich das machen muss?

Gruß Spartaner
-
wenn ein Schiff waffen besitzen soll, so muss es einen vector<waffe_base*> als membervariable haben, damit die polymorphie von den waffen greifen kann (hab den andern thread ein bischen gelesen).
also:class cShip { //... std::vector<cWeaponBase*> m_Waepons; // ... }; cShip::cShip() { // ... // vector mit den waffen füllen if(type == "laserschiff") { m_Weapons.push_back(new cLaserStrahl); m_Weapons.push_back(new cLaserStrahl); // schiff hat 2 laser und eine plasmakanone m_Weapons.push_back(new cPlasmaKanone); } }hoffe konnt ein bisschen helfen
-
Zunächst mal Danke für deine Antwort! Das werde ich direkt mal ausprobieren. In der Zwischenzeit bin ich allerdings selber auf eine Möglichkeit gekommen, mit der ich das gewünschte Ergebnis erziele:
class c_ship { public: std::vector<c_weapon> v_weapon; c_ship::c_ship(/*schiffstyp*/) { c_weapon weapon1(/*waffentyp*/); v_weapon.push_back(weapon1); } } // main.cpp c_ship ship(/*schiffstyp*/); ship.v_weapon[0].get_typeofwpon(); // get_typeofwpon ist eine der Memberfunktionen der Klasse c_weaponWas natürlich direkt auffällt, ist dass ich den vector public habe. An der set/get-Funktion bin ich gescheitert. Macht es überhaupt noch Sinn, hierfür eine set/get Funktion zu schreiben oder kann man dies hierbei belassen?
Und was ist jetzt besser an der Variante von Maxi (ja, ich gehe einfach mal davon aus, dass sie besser ist
). Vorweg muss ich direkt nochmal sagen, dass ich mich noch nicht wieder in den Themenbereich Zeiger und Speicherverwaltung eingearbeitet habe. Dies wollte ich machen, wenn ich es für mein Projekt benötige.
-
das problem an deiner methode ist, dass du in deinen Vektor nur waffen eines bestimmten Typs hauen kannst. d.h. du kannst zB dein LAserschiff nicht mit einem raketenwerfer aufrüsten. ich geh jetz ma davon aus, dass jede waffe eine eigene klasse hat. mit miener methode hast du eben einen zieger auf deine waffe, welche genau das is brauchst du ja ncih zu wissen, du sagst nur Waffe, los schiess und die waffe weiß selber wie sie zu schiessen hat.
Ich würde sagen es wird zeut dich in einen neuen themenbreich einzuarbeiten
btw.: get/set-methoden für die waffen... hm.. vielleicht eine AddWepaon()
aber getmethoden... weiß nich. Kann hilfreich sein, muss aber nich
-
Maxi schrieb:
das problem an deiner methode ist, dass du in deinen Vektor nur waffen eines bestimmten Typs hauen kannst. d.h. du kannst zB dein LAserschiff nicht mit einem raketenwerfer aufrüsten. ich geh jetz ma davon aus, dass jede waffe eine eigene klasse hat.
Nein, ich habe für die Waffen nur eine Klasse. Der einzige Unterschied zwischen den Waffen sind nur die jeweiligen Werte (Genauigkeit, Schaden, Wirkung auf Panzerung, Wirkung auf Schilde usw...) Der Laser hat z.B. einen GrundSchaden von 100 , der Rak-Werfer nur von 50 usw...
Somit brauche ich ja nur einen vector der Klasse c_weapon. Um den Typ der Waffe zu definieren, übergebe ich dem Konstruktor der Klasse c_weapon einen string mit dem Typ der Waffe. Sollte z.b. ein Schiff 2 Laser haben, so muss ich dafür auch nicht 2 Instanzen anlegen, da ich in der Klasse c_weapon eine Membervariable deklariert habe, die die Anzahl der jeweiligen Waffe beinhaltet. Bei der Berechnung des Schadens wird dieser dann einfach mit der Anzahl der Waffen multipliziert, somit habe ich mir eine weitere Instanz der Klasse gespart.Maxi schrieb:
Ich würde sagen es wird zeut dich in einen neuen themenbreich einzuarbeiten
Neu ist der Themenbereich ja nicht für mich, ist nur sehr sehr lange her, wo ich damit gearbeit habe, deswegen weiß ich nicht mehr so genau darüber bescheid. Aber ich bin schon dabei es zu Wiederholen

Maxi schrieb:
btw.: get/set-methoden für die waffen... hm.. vielleicht eine AddWepaon()
aber getmethoden... weiß nich. Kann hilfreich sein, muss aber nichAddWeapon() benötige ich eigentlich nicht, da die Zuweisung der Waffen ja im Konstruktor der Schiffsklasse geschieht. Und nachträglich werden keine Waffen hinzugefügt. Dort werden je nachdem welcher Typ an den Konstruktor übergeben wurde, die verschiedenen Schiffe mit ihren Waffen (vector<c_weapon>) erstellt.
get-methoden brauche ich, wenn es nicht auch anders geht, um meine Schadensberechnung und -zuweisung vorzunehmen. In der weapon-Klasse wird noch die Funktion zur Schadensberechnung eingefügt. Dieser Funktion muss ich die Werte des Gegnerischen Schiffes übergeben (Hülle, Panzerung, Schild usw..., halt alles was zur Berechnung des Schadens benötigt wird) Ist der Schaden dann ermittelt, muss die Funktion den Wert zurückliefern, damit ich diesen dann von dem Hüllenwert des Gegnerischen Schiffes subtrahieren kann.Außerdem wollte ich die get-methoden eigentlich dafür haben, damit ich die Werte der Schiffe ausgeben kann. Auf die Schiffswerte kann ich ja ohne Probleme zugreifen, auf die Waffenwerte auch (so wie ich es momentan gemacht habe)
Deklariere ich den vector v_weapon allerdings private, so müsste ich dafür ja wieder eine set/get-methode definieren, mit der ich wiederum auf die set/get-methoden der Klasse c_weapon zugreifen kann. Ich denke dass dies unnötger aufwand wäre. Auf die Membervariablen kann ich ja eh nicht direkt zugreifen, dafür habe ich ja die Funktionen der c_weapon Klasse. Also ist es doch eigentlich überflüssig für diese nochmals eine Zugriffsfunktion in der Schiffsklasse zu definieren!?