1348Fermer1350
Kevin KoflerLe 31/12/2015 à 12:35
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++.