Когда вы использовали ключевое слово mutable в C ++? - PullRequest
28 голосов
/ 29 декабря 2010

Когда вы использовали ключевое слово C ++ mutable? и почему? Я не думаю, что мне когда-либо приходилось использовать это ключевое слово. Я понимаю, что он используется для таких вещей, как кэширование (или, возможно, запоминание), но в каком классе и в каком состоянии вам когда-либо приходилось его использовать?

Ответы [ 10 ]

43 голосов
/ 29 декабря 2010

Иногда я использую его, чтобы пометить мьютекс или другой примитив синхронизации потоков как изменяемый, чтобы методы доступа / методы запросов, которые обычно помечены как const, все еще могут блокировать мьютекс.

Это также иногда полезно, когдавам нужно оборудовать свой код для целей отладки или тестирования, потому что инструментальным средствам часто требуется модифицировать вспомогательные данные из внутренних методов запросов.

13 голосов
/ 29 декабря 2010

Я использовал mutable в случае результатов кэширования объектов, рассчитанных по внутренним элементам:

class Transformation
{
    private:
        vec3 translation;
        vec3 scale;
        vec4 rotation;
        mutable mat4 transformation;
        mutable bool changed;
    public:
        Node()
        {
            [...]
            changed = false;
        }
        void set_translation(vec3 _translation)
        {
            translation = _translation;
            changed = true;
        }
        void set_scale(...) ...


        mat4 get_transformation() const
        {
            if(changed)
            {
                 // transformation and changed need to be mutable here
                 transformation = f(translation, scale, rotation); // This take a long time...
                 changed = false;
            }
            return transformation;
        }
};

void apply_tranformation(const Transformation* transfo)
{
    apply(transfo->get_transformation());
}
10 голосов
/ 29 декабря 2010

Поиск кода Google раскрывает ряд применений. Например, в реализации криптографии XTR используются изменяемые элементы, чтобы методы могли возвращать ссылку на результат (предотвращая создание копий).

В другом примере Webkit использует его для ленивой инициализации данных элементов (m_lineHeight).

5 голосов
/ 29 декабря 2010

Я использую mutable для членов класса, которые инициализируются по требованию, особенно из базы данных или источника, внешнего по отношению к программе. Это позволяет функциям «получения» создавать объект по требованию, в противном случае это постоянный метод.

4 голосов
/ 29 декабря 2010

Я использую его при блокировке мьютекса для безопасности потоков. Мьютекс помечается как изменяемый, поэтому методы, которые его блокируют, могут оставаться постоянными.

4 голосов
/ 29 декабря 2010

В фиктивных объектах для захвата значения аргументов константных функций в переменной-члене.

class Source
{
public:
    virtual ~Source() {}
    virtual std::string read(int count) const=0;
};

class SourceMock : public Source
{
public:
    mutable std::vector<int> arguments;
    std::string read(int count) const {
        arguments.push_back(count);
        return "...";
    }
};

//TEST....
SourceMock mock;
//...
VERIFY(mock.arguments.size()==2);
VERIFY(mock.arguments[0]==3);
//...
2 голосов
/ 29 декабря 2010

http://msdn.microsoft.com/en-us/library/4h2h0ktk%28v=vs.80%29.aspx будет лучшим примером.Эй, я кое-что узнал сегодня!

1 голос
/ 21 октября 2016

Может использоваться во многих сценариях, например,

Loggers, timing, access counters и т. Д.

Их можно вызывать в методах доступа, соответствующих const, без изменения состояния данных.

1 голос
/ 29 декабря 2010

Мой шаблонный класс реализует шаблон счетчика ссылок.Когда он передается в функции в качестве аргумента с модификатором const , возможно, что ссылка может быть увеличена в любом случае.Так что вместо const_cast может использоваться изменяемый.

0 голосов
/ 01 февраля 2018

изменяемое ключевое слово позволяет изменять переменную в контексте const

например:

class Person {
private:
      mutable int age;

public:
    Person(int age) : age(age)  {

    }
    void setAge(int age) const {
        Person::age = age;
    }

    int getAge() const {
        return Person::age;
    }
};

int main() {

    Person person(23);
    std::cout << "Person age " << person.getAge() << std::endl;
    person.setAge(24);
    std::cout << "Person modified age " << person.getAge() << std::endl;
    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...