C++

mutable, que raios é isso?

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

C++
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)

C++
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:

C++
class Image
{
public:
    void Draw() const;

    <strong> 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

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

Fonte arquivística

Conteúdo recuperado via Wayback Machine, captura 20080528111140.

Abrir registro original ↗

Este mesmo post já existia no antecessor skhaz.wordpress.com. A cópia foi unida a este registro canônico, sem publicar um post duplicado.

Abrir captura da fase WordPress.com ↗

Discussão preservada

6 comentários

  1. 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

  2. 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

  3. 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.

  4. Master Orion

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

  5. 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)

  6. 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 […]