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 ! )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.
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
Quand ça marchera, ça permettra de faire des choses bien propres et safes, enfin, à mes yeux
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();
}