Klasse Weapon: private od. öffenlich?



  • 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 🙂


Anmelden zum Antworten