const-correctnes "übergangen"



  • Aloha Gemeinde...

    ich wende mich mal wieder mit einer allgemeinen Frage an euch.

    Derzeit schreibe einige Wrapper-Klassen für SDL-Strukturen und entsprechende Funktionen (1).

    Im Allgemeinen halte ich es so, dass wenn ich auf Member-Variablen zugreife, diese grundsätzlich konstant (als Referenz oder Zeiger) zurückgebe. Eine Ausnahme bilden hier die builtin-Typen.

    Bsp.Prototyp:

    const SDL_Surface* Surface::getSurface() const;
    

    Nun ist es jedoch so, dass die meisten SDL-Funktionen eben keine Konstanten Zeige erwarten, obwohl diese keine Änderung an den übergebenen Objekten vornehmen (sollten).

    Mein Aufruf einer solchen Funktion sieht derzeit folgendermaßen aus:

    SDL_Flip( const_cast<SDL_Surface*>(surface_obj.getSurface()) ); //(2)
    
    • Wie ist eine solche Vorgehensweise zu bewerten?
    • Gibt es Alternativen zu dieser Vorgehensweise?

    Es grüßt aus dem Sauerland

    Heiko

    Fußnoten:
    (1) http://www.libsdl.org
    (2) Auch ohne nähere Kenntnis der internen Abläufe von SDL_Flip(SDL_Surface*) gehe ich in diesem Fall davon aus, dass das Objekt verändert wird. Diese Funktion soll lediglich exemplarisch angeführt sein.



  • Auf eine lib, die nicht const korrekt ist kannst du keinen const korrekten wrapper bauen.



  • Ist das nur zur Übung sonst würde ich mal aufhttp://sourceforge.net/projects/sdlmm/
    kucken.



  • In der Tat handelt es sich hierbei nur um eine Art Übung. Ich habe auch nicht vor, die SDL komplett abzukapseln, sondern lediglich eine Art Toolkit zusammen zu stricken, welches meinen Quelltext einigermaßen übersichtlich hält.

    SDLmm ist mir bekannt, aber danke für den Hinweis.

    Alles in allem werde ich die von mir beschriebene Vorgehensweise (const_cast) wohl beibehalten.

    Grüße...

    Heiko



  • OP schrieb:

    welches meinen Quelltext einigermaßen übersichtlich hält

    Ich würde das einfach weglassen. const correctnes ist sehr wichtig, aber wenn sich einer nicht daran hält praktisch unmöglich "schön" hinzubekommen.
    Die const_casts machen das lesen nicht gerade übersichtlicher.
    Außerdem sollte doch das flippen eines Surface. Eine member funktion des wrappers sein.



  • Also ich würde auch "Flip" nicht gerade als "const" Opeartion ansehen...
    Von daher passt das schon dass SDL_Flip nen non-const Argument haben will.

    Nicht?



  • Siehe Fußnote 2 😉 - Flip war nur exemplarisch angeführt, weil ich die Funktion gerade vor mir hatte.

    Der Vollständigkeit halber habe ich noch einmal die Header-Dateien durchsucht und folgende Zeilen gefunden:

    #define SDL_BlitSurface SDL_UpperBlit
    [...]
    extern DECLSPEC int SDLCALL SDL_UpperBlit
    			(SDL_Surface *src, SDL_Rect *srcrect,
    			 SDL_Surface *dst, SDL_Rect *dstrect);
    

    Das Augenmerk liegt hier auf src, srcrect und dstrect. Ich gehe als "normalsterblicher Anwendungsschreiber" davon aus, dass die angeführten (Quell-)Parameter bzw. die Objekte, auf denen die Zeiger gerichtet sind, nicht verändert werden. Bei dst (destination == Ziel) ist das ja eindeutig. Genau von dieser Annahme ausgehend habe ich nun die entsprechende Surface-Klasse gestaltet.

    Was ich im Grunde erreichen will, ist, dass alles, was den Bereich des Wrappers verlässt grundsätzlich erst einmal konstant ist. Im Inneren meiner Surface-Klasse wird ohnehin nur ein einzelner (SDL_Surface)Zeiger verwendet - Inkonsistenzen beim Zugriff auf diesen können daher (m.E.) nicht viel Ärger bereiten - und falls doch, hat man diesen bewusst in Kauf genommen.

    Ich hoffe, ich konnte halbwegs verständlich machen, was ich bezwecken will. 🙄

    Grüße aus dem (mittlerweile dunklen) Sauerland

    Heiko



  • Jo also ich kann dir dazu nur sagen dass ich das Problem kenne und hasse wie die Beulenpest.
    Solange dokumentiert ist dass etwas "const" ist (und nur das "const" im Code "nicht da ist"), dann kann man sich IMO noch halbwegs darauf verlassen.

    Wenn es nicht dokumentiert ist... habe ich bei sowas immer ein ungutes Gefühl.


Anmelden zum Antworten