2014-06-16 11 views
7

Für mein Spiel sollte ich eine Rohzeiger SDL_Window erstellen, SDL_Renderer, SDL_Texture usw., wie sie spezifische Löschfunktionen habenIntelligente Zeiger mit SDL

SDL_DestroyTexture(texture); 

oder sollte ich eine benutzerdefinierte deleter hinzufügen, wenn ich eine unique_ptr erstellen oder shared_ptr und wenn ja, wie würde ich das mit SDL-Typen machen?

+1

Was ist der letzte Satz bedeuten - * wie würde ich tun das mit SDL-Variablen *? Fragen Sie, wie man ein "unique_ptr" erstellt, das automatisch ein 'SDL_ *' Objekt zerstört? – Praetorian

+0

Sorry für schlechtes Englisch Ich hätte es nochmal durchlesen sollen. Was ich damit gemeint habe, ist, wie ich ein unique_ptr erstellen kann, um einen SDL_Window/Renderer/Texture usw. zu behandeln, weil sie alle verschiedene Möglichkeiten haben, gelöscht zu werden. Oder sollte ich einfach einen rohen Zeiger verwenden, da es keinen großen Unterschied machen würde, da ich weiß, wo sie gelöscht werden sollen. –

Antwort

23

Sie könnten einen Funktor erstellen, der mehrere überladene operator()-Implementierungen enthält, von denen jede die richtige Zerstörungsfunktion für den jeweiligen Argumenttyp aufruft.

struct sdl_deleter 
{ 
    void operator()(SDL_Window *p) const { SDL_DestroyWindow(p); } 
    void operator()(SDL_Renderer *p) const { SDL_DestroyRenderer(p); } 
    void operator()(SDL_Texture *p) const { SDL_DestroyTexture(p); } 
}; 

Pass dies als deleter zu einem unique_ptr, und man konnte Wrapper-Funktionen schreiben, wenn man will, um den unique_ptr s zu erstellen

unique_ptr<SDL_Window, sdl_deleter> 
create_window(char const *title, int x, int y, int w, int h, Uint32 flags) 
{ 
    return unique_ptr<SDL_Window, sdl_deleter>(
      SDL_CreateWindow(title, x, y, w, h, flags), 
      sdl_deleter()); 
} 
+0

Vielen Dank Praetorian das ist genau das, was ich gesucht habe :) –