Folco (./1345) :
Merci beaucoup Kevin, ça a l'air d'être bien le RAII, même si ça multiplie les classes (ce que j'aime pas trop).Par contre, si ça a l'air utile pour les objets dont la durée de vie est locale à une fonction, ça n'a pas l'air si approprié à mon cas : de multiples appels de fonction dans un constructeur. Ceci dit, je retiens cette technique d'encapsulation des ressources.
Tu peux utiliser un nettoyeur générique:
template <class T> Cleanup {
private:
T *m_p;
void (T::*m_pCleanup)();
public:
Cleanup (T *p, void (T::*pCleanup)()) : m_p(p), m_pCleanup(pCleanup) {}
~Cleanup() {m_p->m_pCleanup();}
}
// Create the button texture (transparent) and set it as render target
m_Texture = SDL_CreateTexture(Game::get()->renderer(), px, SDL_TEXTUREACCESS_TARGET, width, height);
if (m_Texture == nullptr) throw Exception(ERROR_SDL_STR);
Cleanup<MyClass> c(this, &MyClass::cleanup);
if (SDL_SetTextureBlendMode(m_Texture, SDL_BLENDMODE_BLEND) != 0) throw Exception(ERROR_SDL_STR);
if (SDL_SetRenderDrawColor(Game::get()->renderer(), 0, 0, 0, 0) != 0) throw Exception(ERROR_SDL_STR);
if (SDL_RenderClear(Game::get()->renderer()) != 0) throw Exception(ERROR_SDL_STR);
if (SDL_SetRenderTarget(Game::get()->renderer(), m_Texture) != 0) throw Exception(ERROR_SDL_STR);
Ce n'est pas forcément plus lisible (ni plus efficace au niveau du code produit) que ma macro FINALLY, mais c'est plus conforme à l'esprit du C++.