Klasse Weapon: private od. öffenlich?
-
class IWeapon { public: virtual void do_blabla() = 0; public: void set_munition(...); protected: std::string m_name; // Name der Waffe int m_ammo; // Munition: 24/30 || 8/30 || 14/30, usw.. übrig int m_ammoMagazin; // Munition pro Magazin int m_countMagazines; //Magazin = 2 als Bsp. 2 = 2 * 30(Munition im/pro Magazin) Munition int m_weaponDamage; //Schaden pro Hit int m_aimQuality; // Schussqualität }und davon erben dann alle Waffen.
-
Naja, wenn du für jede Member-Variable eine get- und set-Methode implementierst, kannst du die Variablen auch gleich alle öffentlich machen, bzw dann stimmt was im Design nicht oder du solltest die Daten in einer struct zusammenfassen.
-
Hab nicht gesagt für jede ... außerdem ist selbst dann das Design ok.
Mach ne Funktion set_ammo (bzw. set_monution) wo du dann alle Parameter, die die Munition betreffen, gesetzt werden.
-
(D)Evil schrieb:
Hab nicht gesagt für jede ... außerdem ist selbst dann das Design ok.
Mach ne Funktion set_ammo (bzw. set_monution) wo du dann alle Parameter, die die Munition betreffen, gesetzt werden.hallo,
aber wenn ich gleich die ganzen Variablen(ammo, name,etc.) als public setze, ist es doch nicht schlimm, oder?
Außerdem kann ich ja das machen, was du mir mit der Funktion set_ammo erklärt hast machen
Mit freundlichen Grüßen,
Daniel
-
Getter/Setter machen auf jeden Fall sinn und eigentlich benutze ich sie für jede Variable - greife nie direkt darauf zu.
IWeapon->m_ammo = -1;
Macht keine Sinn, kann aber vorkommen, wenn du das IWeapon Objekt hast ... Wird dir sicher nicht passieren, wenn du die komplette Anwendung schreibst.
bool IWeapon::setAmmo(int m_ammo) {
//prüfe of der Wert positiv ist ... usw.
//und wenn alle ok ist, kommt die Zuweisung
this->m_ammo = m_ammo;
}Hoffe das trägt etwas zum Verständnis bei

Greetz Kon
-
http://www.cpp-tutor.de/cpp/le09/le09_01.htm#zrechte Lesen und verstehen

-
hey des geht ja nit mit get_value

bitte helfet mir ich hab auch sowas vor zu machen.
wie macht man denn sowas mit privaten membern in einer klasse(mit private:)?ich will also auf private irgendwij zugriffe aber weiss leider nicht wie

-
Hier ein kleines Beispiel:
#include <iostream> using namespace std; class Weapon { private: int ammo; // Munition: 24/30 || 8/30 || 14/30, usw.. übrig //usw.... public: bool setAmmo(int ammo); int getAmmo(); }; bool Weapon::setAmmo(int ammo) { //wie gesagt, ist nur ein Beispiel, man kann es noch an andere //Bedingungen knüpfen. if (ammo > -1) { this->ammo = ammo; return true; } else { //Wert ist nicht negativ, daher wird der Wert nicht gesetzt! return false; } } int Weapon::getAmmo() { return this->ammo; } int main() { Weapon myWeaponObjekt1; myWeaponObjekt1.setAmmo(22); //myWeaponObjekt1.ammo = -1111; GEHT NICHT MEHR ... direkter Zugriff ohne zu kontrollieren, was der Wert für einen Inhalt hat ... //der Wert muss quasi die Tür (die Setter Funktion) passieren um Auswirkungen auf den eigentlichen Wert zu haben. myWeaponObjekt1.setAmmo(-1); cout << myWeaponObjekt1.getAmmo() << endl; return 0; }Aber eigentlich muss man wirklich nur lesen
und nach einer Weile macht es dann klick ...
-
Ihr baut euch setter, die per booleanwert zurückgeben, ob das setzen des Wertes Funktioniert hat? Fragt ihr den scheiß jemals ab?
void Weapon::setAmmo(int ammo) { assert (ammo >= 0); this->ammo = ammo; }Wobei natürlich die frage ist, ob das überhaupt sinn macht und man nciht eher ein "reload" oder sowas haben sollte.
-
ich würde viel weiter abstrahieren. es handelt sich um eine klasse waffe, wie wird diese waffe verwendet? wahrscheinlich soll nicht irgendwer beliebig munition rausnehmen oder hinzufügen.
class Weapon{ public: bool shoot(); void reload(); int getAmmo(); int addAmmo(int ammo); }shoot sorgt dafür, dass exakt eine kugel aus dem magazin entfernt wird und die derzeitige munition korrekt um exakt eins dekrementiert wird.
reload versucht ein magazin der waffe voll nachzuladen. dabei wird der vorrat an kugel entsprechend korrekt dezimiert.
getAmmo ist selbsterklärend und liefert die anzahl der verbleibenden kugeln.
addAmmo kann genutzt werden, um den munitonsvorrat zu erhöhen, verändert aber nichts am ladezustand der waffe.
diese art der abstrahierung ist "sicher", da sich derjenige, der die waffe verwendet nicht um die für das "nachladen und schiessen" der waffe nötige logik kümmern muss und das objekt "waffe" so zu jedem zeitpunkt konsistent bleibt.
-
hört sich ja verdammt einfach an, 3D-Shooter zu programmieren.
wenn es reloadet ist, soll der vorrat an muniton dezimiert werden. auf was soll da die klasse zugreifen? müsste man noch eine höhere klasse "player" schreiben wo es definiert wird welche items und munition er trägt.
hmmm das ist ja wirklich einfach. merkwürdig...
-
Waffen gehören immer weggesperrt.

-
was? wieso? die sind doch wichtig sonst sind die monster nicht zu stoppen
-
thordk schrieb:
ich würde viel weiter abstrahieren. es handelt sich um eine klasse waffe, wie wird diese waffe verwendet? wahrscheinlich soll nicht irgendwer beliebig munition rausnehmen oder hinzufügen.
Eben deshalb meinte ich, getter- und setter-Funktionen für (fast) jede Variable wären sinnlos...
zogga schrieb:
hört sich ja verdammt einfach an, 3D-Shooter zu programmieren.
Wenn man von Anfang an alles durchplant (eben solche Klassen), ist es wirklich nur halb so schwer, wie oft dargestellt wird
Daran scheitern eben viele, weil man sich gerne hinsetzt und einfach drauf lostippt. Aber Programmieren ist (zum Glück) nicht gleich Tippen, ich für meinen Teil denke 2/3 und tippe 1/3. Man kann sich ja auch Block und Stift nehmen, Zigaretten einpacken und sich draußen auf eine Bank setzen, wo man sich dann Gedanken über irgendwelche Klassen, deren Beziehungen oder das Gesamt-Design macht.
-
Badestrand schrieb:
Wenn man von Anfang an alles durchplant (eben solche Klassen), ist es wirklich nur halb so schwer, wie oft dargestellt wird
Daran scheitern eben viele, weil man sich gerne hinsetzt und einfach drauf lostippt. Aber Programmieren ist (zum Glück) nicht gleich Tippen, ich für meinen Teil denke 2/3 und tippe 1/3. Man kann sich ja auch Block und Stift nehmen, Zigaretten einpacken und sich draußen auf eine Bank setzen, wo man sich dann Gedanken über irgendwelche Klassen, deren Beziehungen oder das Gesamt-Design macht.das hört sich schön an! dann kann ich ja 2/3 draußen in der natur sein!
-
Ist sowieso gesünder, für Augen, Rücken, Kopf, Lunge und alles drumherum
