"dynamischen" Zeiger an Funktion weitergeben



  • Wenn ich es mir recht überlege, müsste ich die Funktion der Grafikklasse
    "überladen".
    Eine Funktion für jede Klasse Kämpfer in der Parameterliste...
    das müsste doch klappen,oder was meint ihr? 🙂



  • Problem bei meiner Idee mit "Überladen" der Funktionen:

    Ich muss den Zeiger ja am Anfang deklarieren... der muss aber auch je nach Klasse, die gewählt wird, erstellt werden. 😞

    Und das Überladen bringt mich ja auch ins absolute Chaos... wenn ich 8 Kämpfer zu Auswahl gebe, muss ich ja eine Funktion für jede theoretisch mögliche Funktion schreiben 😮



  • drakon schrieb:

    Habe auch schon mal mit dem Gedanken gespielt ein Strassenkampf Spiel zu programmieren, da es das imo recht wenig gibt, also nur zu! 🙂

    Zu deinem Problem:
    Das Zauberwort heisst hier Polymorphie. Sprich du leitest die Spieler von einer Klasse ab, und da drin hast du die allgemeingültige Schnitstelle, auf die du zugreifen kannst und dann je nach Laufzeit Typ die entsprechenden Funktionen aufrufen.

    Das kannst du am besten in einem guten Buch nachlesen, oder mal für den Start hier:
    http://de.wikibooks.org/wiki/C%2B%2B-Programmierung:_Polymorphie

    btw:
    Ich gebe hier aber zu bedenken, dass du für die Spieler besser nicht ein Haufen verschiedene Klassen machst. Denn, überleg mal, was die Gemeinsamkeiten und Unterschiede von den verschiedenen Spielern sind. Na? - Wohl sehr viele Gemeinsamkeiten und nur sehr wenige Unterschiede. Da wäre es doch besser eine allgemeingültige Klasse zu schreiben, welche dann über Parameter z.B die Stärke, Aussehen, verfügbare Attacken usw. gesteuert werden kann.

    Deine Idee ist doch besser 😉



  • Du hast es erfasst. 😉

    Polymorphie ist nett, aber die richtige Technik am richtigen Ort ist besser.



  • Hab' jetzt eine allgemeine Klasse "Spieler" und leite davon die einzelnen Kämpferklassen ab.

    Hab jetzt eine Kämpfer-Klasse erstellt, bekomm' jedoch immer einen Fehler im Konstruktor dieser Klasse.

    Fehler: C:\C++\Artes_Marciales\benjamin.cpp||In constructor Benjamin::Benjamin(int, int)':| C:\\C++\\Artes_Marciales\\benjamin.cpp|10|error: no matching function for call toSpieler::Spieler()'|
    C:\C++\Artes_Marciales\spieler.hpp|11|note: candidates are: Spieler::Spieler(const Spieler&)|
    C:\C++\Artes_Marciales\spieler.hpp|25|note: Spieler::Spieler(int, int)|
    ||=== Build finished: 1 errors, 0 warnings ===|

    Jemand eine Idee warum?

    #include <iostream>
    #include "spieler.hpp"
    
    using namespace std;
    
    class Benjamin : public Spieler
    {
    
    public:
    //Memberfunktionen
        Benjamin(int x, int y); //Konstruktor, initialisiert die Werte... 
    
    };
    
    #include <iostream>
    #include "benjamin.hpp"
    #include "SDL/SDL.h"
    
    using namespace std;
    
    Benjamin::Benjamin(int x, int y) //Konstruktor, initialisiert die Werte
    {
        x_koordinate_spieler = x;
        y_koordinate_spieler = y;
        x_animationsphase = 0;
    }
    
    #include <iostream>
    
    using namespace std;
    
    class Spieler
    {
    
      protected:
      //Membervariablen
      int x_koordinate_spieler; // können hier nicht initalisiert werden?
      int y_koordinate_spieler; // brauchen zum Auslesen und Verändern eigene Memberfunktionen!
      int x_animationsphase;
    
      public:
    
      //Memberfunktionen
          Spieler(int x, int y); //Konstruktor, initialisiert die Werte... 
      int lesen_x();
      int lesen_y();
      int get_animationsphase();
      int schreiben_animationsphase(int neue_animationsphase);
      int schreiben_x(int neue_x_koordinate);
      int schreiben_y(int neue_y_koordinate);
      void laufen_rechts();
      void laufen_links();
      void springen_oben();
      void ducken();
    
    };
    


  • Es steht schon fast in der Fehlermeldung, was du machen sollst.

    Benjamin::Benjamin(int x, int y) //Konstruktor, initialisiert die Werte
    : Spieler (x,y)
    {
        x_koordinate_spieler = x;
        y_koordinate_spieler = y;
        x_animationsphase = 0;
    }
    

    Du musst die Basisklasse ja auch erzeugen, und wenn du da keinen Standardkonstruktor hast, dann musst du den Konstruktor da von Hand aufrufen. (In der Initialisierungsliste).



  • Vielen Dank, klappt jetzt! 🙂

    Wie würde denn ein Standardkonstruktor aussehen?



  • gans einfach:
    x_koordinate_spieler, y_koordinate_spieler // zu lang und hässlich brrrrrrr schauder

    x_koordinate_spieler -> x
    y_koordinate_spieler -> y

    Spieler(){x=0,y=0;}
    


  • ß0asdf09 schrieb:

    gans einfach:

    gans? ente?



  • unskilled schrieb:

    ß0asdf09 schrieb:

    gans einfach:

    gans? ente?

    Ente gut alles gut 😃


Anmelden zum Antworten