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 :)


Ações

Informações

6 respostas

5 02 2008
Daniel

Até onde eu sei o uso de mutable não é muito recomendado, é só para casos muito concretos (realmente nunca precisei). Tem um artigo interessante, que discute o uso de mutable: http://www.highprogrammer.com/alan/rants/mutable.html

5 02 2008
skhaz

Eu também não recomendo usar ela, porem é bom saber que existe e para que serve, precisei usar apenas uma vez em um trecho da Wintermoon no exemplo Player no metodo draw (talvez eu realmente não precissa-se usar). Esse artigo é otimo, e eu já tinha lido ele antes de escrever este post. obrigado por comentar ;D

5 02 2008
vinigodoy

O exemplo que ele deu foi bom.

A palavra mutable não é recomendada quando envolve atributos que tem relação com o estado da classe. O que não é o caso, por exemplo, do contador de erros, variável tipicamente usada para logs, e que deveria ser imperceptível para um observador externo.

Eu também nunca precisei dela.

Mas… como uma das políticas do C++ é certamente dar poder ao programador para fazer tudo, seja isso bom ou não, é bom conhecer os recursos, e os impactos que ele pode causar.

7 02 2008
Master Orion

Isto eh q eu chamo de um blog do underground ^^
nunca vi em nenhum curso essa funçao da C++
realment parabens

8 02 2008
skhaz

Valeu, realmente foi dificel achar um exemplo legal para usar nesse artigo…
quanto a mutable é meio rara alguem usar ou falar sobre ela, só vi a engine Ogre usar ela ate hoje (e a wintermoon claro)

8 04 2008
Mutable, o legado | SKHAZ's Blog

[...] nosso artigo mutable, que raios é isso? agora irei demonstrar um segunda maneira de “burlar” o mesmo método const sem usar [...]

Deixe um comentário