Klassenproblem [gelöst]



  • Hallo, ich schreibe ein kleines Pong Spiel. Da ich leider noch Anfänger in Objektorientierter Programmierung bin, würde ich tippen, das folgende Problem ist wahrscheinlich für einen Profi leicht zu erkennen. Ich finde bzw. begreife es jedoch nicht.

    Ich habe folgende Klassen:
    Spieler und Ball

    Die Spieler.h sieht folgendermaßen aus:

    #ifndef _SPIELER_H_
    #define _SPIELER_H_
    #include "C:/Programme/CodeBlocks/SDL-1.2.13/include/SDL.h"
    #include "Ball.h"
    
    class SDL_Surface;
    namespace Game
    {
        class Ball;
    
        class Spieler
        {
            friend void Game::Kollisionsabfrage(Ball &Ball, Spieler &Spieler);
            friend void Game::Kollisionsabfrage(const SDL_Surface *screen,
                                                Spieler &Spieler1,
                                                Spieler &Spieler2, Ball &Ball,
                                                const int& SpielfeldversatzX,
                                                const int& SpielfeldX,
                                                const int& SpielfeldversatzY,
                                                const int& SpielfeldY);
    
            public:
                Spieler(const int& SpielfeldversatzX, const int& SpielfeldX, const int& SpielfeldversatzY,
                        const int& SpielfeldY, int AILevel, int Spielfeldseite);
                void SpielerSteuerung(bool& laeuft, const int& SpielfeldX,
                                      const int& SpielfeldversatzY, const int& SpielfeldY);
                void BotSteuerung(bool& laeuft, const int& SpielfeldversatzX, const int& SpielfeldX,
                                  const int& SpielfeldversatzY, const int& SpielfeldY,
                                  const Ball &Ball);
                void PositionBerechnen(const double& Geschwindigkeit, const Uint32& Zeitspanne);
                void Abdecken(SDL_Surface *screen);
                void Darstellen(SDL_Surface *screen);
                int GetPoints();
                int GetAILevel();
    
            protected:
                double dPosX;
                double dPosY;
                int w;
                int h;
                int Punkte;
                int AILevel; //0 bedeutet es ist ein vom Spieler gesteuerter Spieler
                double dSpeedY;
                int Spielfeldseite; //1 = links, 2 = rechts
        };
    }
    #endif
    

    Bei der Botsteuerung werden die Daten des Balles mit den Klassenfunktionen der Ballklasse:

    double GetPosX();
    double GetPosY();
    double GetSpeedX();
    double GetSpeedY();

    abgefragt, damit die KI halt entsprechend reagieren kann. Hier die gekürzte Spieler.cpp mit den wichtigen Stellen:

    #include "C:/Programme/CodeBlocks/SDL-1.2.13/include/SDL.h"
    #include "Spieler.h"
    #include "Ball.h"
    
    ...
    
    void Game::Spieler::BotSteuerung(bool& laeuft, const int& SpielfeldversatzX, const int& SpielfeldX,
                                     const int& SpielfeldversatzY, const int& SpielfeldY,
                                     const Ball &Ball)
    {
        double SpielerYMitte = dPosY + ((SpielfeldX/16.5)/2);
        double BallYMitte = Ball.GetPosY()+((SpielfeldX/82.6)/2);
    
    ...
    
    double WegY = (Entfernung/Ball.GetSpeedX()) * Ball.GetSpeedY();
    etc.
    

    Ich verwende mehrmals diese Get-Funktionen und erhalte für jede Verwendung die selbe Quittung vom Compiler:

    C:\...\Spieler.cpp|72|error: passing `const Game::Ball' as `this' argument of `double Game::Ball::GetPosY()' discards qualifiers|
    

    Google hat jetzt irgendwie nix sinnvolles dazu ausgespuckt und ich werd daraus auch nicht schlau.

    Kann mir vielleicht jemand sagen, was dem Compiler nicht passt?



  • Ich hab hier:

    http://stackoverflow.com/questions/550428/an-odd-c-error-test-cpp15-error-passing-const-as-this-argument-of

    gefunden, dass ich keine nicht konstante Funktion auf ein als const übergebenes Objekt anwenden darf. Eigentlich logisch, 'tschuldigung, dass ich deshalb geschrieben habe. 😞



  • Die relevante Datei hast du nicht gepostet (Ball.h), aber...
    du hast eine Referenz auf einen konstanten Ball, also darfst du auch nur konstante Memberfunktionen aufrufen. Um eine solche als konstant auszuweisen, musst du der Deklaration nur ein const nachstellen (z.B. double GetPosY() const;).
    Geht natürlich nur, wenn die Memberfunktion das Objekt nicht verändert, das sollte aber bei Gettern der Fall sein.

    Edit: ach ja, hattest es ja schon herausgefunden 😃


Anmelden zum Antworten