mutable, que raios é isso?

5 02 2008

Talvez você seja como eu, viciado em usar const, mais muitas vezes nos deparamos com métodos que precisamos alterar
algum atributo dentro de um método declarado como const

class Image
{
   public:
       void Draw() const;

   private:
      std::size_t m_BlitErrorCount;
}

Vejamos esse exemplo do metodo Draw da classe Image
precisamos implementar um contador de erros do SDL_BlitSurface (sinceramente não vejo utilidade isso)

void Image::Draw() const
{
    if (SDL_BlitSurface(mSurface, NULL, Screen, rect) < 0)
    {
        m_BlitErrorCount++;
        // O compilador acusa erro na linha acima
        // pois não podemos modificar qualquer
        // atributo dentro desse método declarado como const
    }
}

Como solucionar?

Adicione a palavra reservada mutable na declaração de m_BlitErrorCount, ficando assim:

class Image
{
    public:
        void Draw() const;

    private:
        mutable std::size_t m_BlitErrorCount;
}

Veja também

Um outro caso para o uso da mutable é na implementação do design Organizando a janela em classes, de nosso amigo Vinícius, onde temos à seguinte declaração do método draw

virtual void draw() const = 0;

Usando a palavra reservada mutable na declaração do atributo usado internamente em draw você “burla” o const

Agora seu código compila sem erros :)