[Anfänger] Fragen zur Programmierung mit Klassen



  • In einer Initialisierungsliste kannst du nur Elemente initialisieren, die unmittelbar zur Klasse des zu konstruierenden Objekts gehören. In deinem Beispiel versuchst du in Initialisierungsliste der Klasse Enemy Elemente der Klasse Charakter zu initialisieren, was nicht erlaubt ist.



  • DocShoe schrieb:

    In einer Initialisierungsliste kannst du nur Elemente initialisieren, die unmittelbar zur Klasse des zu konstruierenden Objekts gehören. In deinem Beispiel versuchst du in Initialisierungsliste der Klasse Enemy Elemente der Klasse Charakter zu initialisieren, was nicht erlaubt ist.

    Echt? Dann habe ich mich vom Compiler reinlegen lassen.
    http://ideone.com/t1AHr



  • Mein Posting bezieht sich auf das Problem von theuring, Zeile 36. Da versucht er Elemente der Basisklasse per Initialisierungsliste zu intialisieren.

    @cooky451
    Du rufst den Charakter Konstruktor auf, was völlig ok ist.



  • Ach so und ich dachte schon ich müsste gefühlte 50k Zeilen Code umschreiben. 🤡



  • Warum muss das alles nur so kompliziert sein? 😉
    Ich komme mit eurem Code einfach nicht klar, werde wohl meinen inneren Schweinehund überwinden müssen und nochmal Basics lernen, damit ich endlich ein einfaches, kurzes, aber "ordentlich" geschriebenes, textbasiertes RPG hinbekomme... 😞 🙄

    @cooky451: In deinem Link geht es um das "Dungeons & Dragons v3.5" Regelwerk - ich möchte aber ein schönes, "altes" "Advanced Dungeons & Dragons" (v2) Regelwerk verwenden. Dieser ganze Kram ab v3 ist nämlich total Einsteigerfreundlich (auch eher für jüngere Spieler, finde ich) - und das will ich ja nicht 😉
    Ganz zu schweigen davon, das D&D3.5 vielleicht wenige hundert Seiten Regelwerk hat - AD&D(2.0) hat mehrere Tausend 🙂
    Auch vielend Dank für eure vielen Hinweise zur Initiative - aber das Regelwerk sieht "Gleichzeitigkeit" vor und so wird es auch von mir umgesetzt werden 😉

    Ich werde versuchen, mir jetzt nochmals Pointer und Konstruktoren reinzuziehen, bis ich es wirklich zu 100% verstehe. Wenn ich zu blöd dafür sein sollte... dann weiß ich auch noch nicht. Jedenfalls muss ein Text-RPG mit rudimentärem AD&D 2nd Edition Kampfsystem her... 😋



  • Hallo C++ler,

    ich habe mich nun nochmal mit der Materie und auch dem von cooky451 gegebenen Beispiel (http://ideone.com/t1AHr) beschäftigt. Wenn ich das Beispiel so (oder leicht abgeändert) um setze, kann ich aber immer noch keinen Zugriff auf die Membervariablen durchführen. Ein

    Enemy Gegner("test", 10, 10);
    	cout << Gegner.current_life << endl;
    

    bringt mir den Fehler

    1>c:\users\tobias\documents\visual studio 2010\projects\rpg01\rpg01\main.cpp(33): error C2039: 'current_life': Ist kein Element von 'Enemy'
    1> c:\users\tobias\documents\visual studio 2010\projects\rpg01\rpg01\main.cpp(21): Siehe Deklaration von 'Enemy'

    Wie bekomme ich also diese Sache endgültig in den Griff?
    Wäre nett, wenn da jemand kurz & knapp helfen kann 🙂

    P.S.: Hier nochmal mein kompletter Code: http://ideone.com/q3DxX
    Die ganzen Includes sind nur drin, weil später noch Code kommt, der diese ganzen Libs braucht.



  • Die Variable heißt:

    current_life_

    und nicht:

    current_life



  • oha - wie peinlich. Naja, dann weiß ich jetzt ja Bescheid. Oder auch nicht. Jedenfalls funktioniert es nun so, wie es soll - Danke!
    Ich schaue mir die Sache nochmal genau an, um selber zu verstehen.
    Dann wird Morgen das größte RPG aller Zeiten mit 5D-Grafik und 22.2 Sound sowie 50.000h Mindestspielstunden fertig sein... 🙄

    P.S.: ich habe nun verstanden, war ja auch gar nicht schwer. Ich dachte halt bisher, dass in der Enemy-Klasse die Variablen-Namen "überschrieben" werden.



  • Hallo,

    kann ich einen Vector an eine Funktion übergeben, damit ich in dieser Funktion mit dem Vector arbeiten kann? Ganz speziell: Ich möchte dem Vector (der eine Klasse als Inhalt hat) Objekte hinzufügen (push_back).



  • Mit einer Referenz:

    void my_super_function(std::vector<int>& mynumbers)
    {
        mynumbers.push_back(42);
    }
    


  • Vector: Objekte löschen / Speicher freigeben / Speicherloch schließen

    volkard schrieb:

    vector<cCharakter*> dieGegner;//Sorry, Speicherloch vorprogrammiert. Läßt sich aber besser suchen. 
    //Speicherloch dann wegmachen mit ptr-Container. Erstmal hinkriegen, schlage ich vor.
    

    Ja, genau da bin ich nun. "Der Ork wurde vom Spieler in zwei Hälften gespalten. Tote Orks haben aber nichts mehr im Gegner-Vector zu suchen..."
    Also habe ich schon mit .erase was versucht, dass gibt natürlich einen netten Laufzeitfehler (mein erster 🙂 ). Das Problem ist wohl auch, das gerade im Moment des Löschens ein Iterator durchläuft.
    Mein Wunschtraumcode:

    //Alle Gegner auf Tod prüfen
    for (i=GegnerV.begin();i<GegnerV.end();i++)
    {
    	if ( i->current_hp <= 0)
    	{
    		cout << i->name << " ist tot.";
    		GegnerV.erase(i);
    		cout << " Und wird rausgeschmissen." << endl;
    	}
    }
    

    Wenn ich nach "ptr_vector" google, lande ich bei Boost. Ist das ein muss? Ich meine, früher oder später brauche ich wohl sowieso eine ordentliche Lib für Zufallszahlen, aber vielleicht sollte ich erstmal weiter die STL kennenlernen...



  • thuering schrieb:

    Wenn ich nach "ptr_vector" google, lande ich bei Boost. Ist das ein muss?

    Eher eine gute Empfehlung. Dynamische Speicherverwaltung in Containern wird schnell mühsam und fehleranfällig, der benötigte Code für eine korrekte Behandlung tendiert zur Unübersichtlichkeit. Wenn es sich vermeiden lässt, speichere keine Zeiger mit Besitz in Containern.

    Aber wenn du dich mit der STL noch nicht auskennst, bringen dir die Boost-Container auch nicht allzu viel. Lies dich am besten mit einem guten C++-Buch ein, hier auf der Artikelseite gibts auch Einführungen in die STL.

    Generell kann auch std::remove_if erwähnt werden, das in Kombination mit erase() alle Elemente rauswirft, die eine gewisse Bedingung erfüllen (z.B. current_hp <= 0 ). Ist bei std::vector auch viel effizienter als mehrere erase() -Aufrufe, weil nachfolgende Elemente nicht jedes Mal umkopiert werden müssen, wenn eine Lücke entsteht.



  • OK, gut. Aber wie komme ich meinem ins Leere laufenden Iterator (?) weiter?

    In einem anderen Forum hatte jemand dasselbe Problem, ich verstehe aber die dort aufgezeigte Lösung nicht:

    vector<SFlag*>::iterator it = flags.begin();
    while (it != flags.end()) {
      if (it->x == robot.x && it->y == robot.y) {
        flags.erase(it); break;
      }
      ++it;
    }
    

    EDIT: Quelltext richtig kopiert



  • Ich habe meine eigene Suppe gekocht! 😉 😃

    //Alle Gegner auf Tod prüfen
    bool tot = false;
    int toter = 0;
    for (i=GegnerV.begin();i<GegnerV.end();i++)
    {
    	if ( i->current_hp <= 0)
    	{
    		cout << i->name << " ist tot.";
    		tot = true;
    		toter = i->id - 2;
    	}
    }
    if (tot)
    {
    	GegnerV.erase(GegnerV.begin()+toter);
    }
    tot = false;
    

Anmelden zum Antworten