42Fermer44
FarewellLe 03/01/2016 à 11:41
Bon, j'ai écrit un template pour essayer de généraliser les choses. Déjà, une heure de potassage pour comprendre la syntaxe bordélique à souhait, sans comprendre pourquoi certaines choses me paraissent redondantes. En fait, j'en ai jamais écrit avant, donc je découvre.
Ca donne ça :
ResourceHolder.hpp
template <typename restype> class ResourceHolder { public: ResourceHolder(restype resource); ~ResourceHolder(); restype resource() const; restype release();; private: restype m_Resource; };
ResourceHOlder.cpp
template<typename restype> ResourceHolder<restype>::ResourceHolder(restype resource) { m_Resource = resource; } template<typename restype> ResourceHolder<restype>::~ResourceHolder() { if (m_Resource != nullptr) delete m_Resource; } template<typename restype> restype ResourceHolder<restype>::resource() const { return m_Resource; } template<typename restype> restype ResourceHolder<restype>::release() { restype res = m_Resource; m_Resource = nullptr; return res; } template<> ResourceHolder<SDL_Surface*>::~ResourceHolder() { if (m_Resource != nullptr) SDL_FreeSurface(m_Resource); } template<> ResourceHolder<SDL_Texture*>::~ResourceHolder() { if (m_Resource != nullptr) SDL_DestroyTexture(m_Resource); }
Voilà, c'est tout simple, quelques one-liners et deux spécialisations pour libérer correctement les SDL_Surface* et SDL_Texture* (merci le raccourci Ctrl-F ! embarrassed)

Evidemment, quand j'en instancie, ça déconne dans les grandes largeur : ResourceHolder<SDL_Surface*> surface(wIMG_Load(filename));
=> ResourceFactory.cpp:41: undefined reference to `ResourceHolder<SDL_Surface*>::ResourceHolder(SDL_Surface*)'

J'explique mon idée : Je veux un ResourceHolder, contenant un type SDL_Surface*. Son nom est surface, et il est construit avec en argument la valeur de retour de wIMG_Load(filename). Voilà, c'est pas compliqué, et pourtant j'ai la furieuse impression que g++ et moi ne sommes pas sur la même longueur d'onde. grin
J'ai parcouru plusieurs tutos et mon bouquin, je vois pas où je pèche, pourriez-vous m'aider svp, parce que je commence à sécher, merci d'avance cheeky



Quand ça marchera, ça permettra de faire des choses bien propres et safes, enfin, à mes yeux grin
Source propre et safe à mes yeux
SDL_Texture* ResourceFactory::makeButtonState(SDL_Renderer* renderer, Uint32 px, SDL_Rect* iconRect, SDL_Texture* iconTexture, int frame, int offsetX, int offsetY) { // Create the texture of the button and put its frame ResourceHolder<SDL_Texture*> button(wSDL_CreateTexture(renderer, px, SDL_TEXTUREACCESS_TARGET, BUTTON_WIDTH, BUTTON_HEIGHT)); wSDL_SetTextureBlendMode(button.resource(), SDL_BLENDMODE_BLEND); ... // Reset render target wSDL_SetRenderTarget(renderer, nullptr); return button.release(); }
smile