const-Ueberladung funktioniert nicht....



  • ok, wahrscheinlich eine dumme Frage:

    SDL_Rect* getRect() {return &mRect;}
        const SDL_Rect* getRect() {return &mRect;}
    

    Die 2. Zeile hab ich hinzugefuegt damit ich die Methode auch benutzen kann wenn ich mit const-Objekten arbeite.

    Aber beim Compilieren meckert der GCC:

    sdl_sprite.h:43: `const SDL_Rect* SDL_Sprite::getRect()' and `SDL_Rect* SDL_Sprite::getRect()' cannot be overloaded
    

    was mach ich falsch? 😕



  • was mach ich falsch?

    Du hast ein const vergessen:

    SDL_Rect* getRect() 
    {return &mRect;}
    const SDL_Rect* getRect() const // das letzte const ist entscheidend
    {return &mRect;}
    


  • dann jetzt noch ein paar dumme Fragen:

    1. was macht das erste const? (den Rueckgabewert const machen, damit er von der Aufrufenden Funktion nicht veraendern werden kann, oder?)
    2. was macht das 2.te? (versichern dass die Memberfunktion das Objekt nicht veraendert? - und wenn das so ist, wozu brauch ich das in meinem Beispiel?)
    3. wieso kann ich die Funktion nicht ueberladen mit dem 1. const? die Signatur der Funktion aendert sich dadurch ja, und darauf kommt es doch an, oder? 😕


    1. was macht das erste const? (den Rueckgabewert const machen, damit er von der Aufrufenden Funktion nicht veraendern werden kann, oder?)

    Der aufrufende Code erhält einen Zeiger. Das const stellt sicher, dass über *diesen* Zeiger m_rect nicht verändert werden kann.

    1. was macht das 2.te? (versichern dass die Memberfunktion das Objekt nicht veraendert? - und wenn das so ist, wozu brauch ich das in meinem Beispiel?)

    Das hintere const bezieht sich auf das Objekt selbst (also auf this). this wird dadurch zum Zeiger auf const. Die Attribute des Objekts können über diesen Zeiger (also über solche Methoden) nicht verändert werden (Ausnahme: mutable deklarierte Attribute).

    1. wieso kann ich die Funktion nicht ueberladen mit dem 1. const? die Signatur der Funktion aendert sich dadurch ja, und darauf kommt es doch an, oder?

    Der Rückgabewert einer Methode/Funktion gehört aus Überladungssicht *nicht* zur Signatur. Aus Sicht von Überladung gehört nur die Parameterliste (inklusive Templateparameterliste) und bei Methoden optionale const/volatile-Qualifkationen zur Signatur.

    Demzufolge haben

    SDL_Rect* getRect() {return &mRect;}
    const SDL_Rect* getRect() {return &mRect;}
    

    die gleiche Signatur. Eine Überladung findet nicht statt.



  • thx für die Erklärungen 🙂


Anmelden zum Antworten