Подтвердить что ты не робот

Когда вы использовали ключевое слово "изменчивое" С++?

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

4b9b3361

Ответ 1

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

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

Ответ 2

Я использовал 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());
}

Ответ 3

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

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

Ответ 4

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

Ответ 5

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

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);
//...

Ответ 6

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

Ответ 8

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

Ответ 9

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

Loggers, timing, access counters и т.д.

Они могут быть вызваны в конструкторах с поддержкой const без изменения состояния данных.

Ответ 10

Его также можно использовать, если внутри метода получения (обычно это const), вам нужно обновить сохраненное возвращаемое значение. В качестве примера предположим, что у вас есть конкретная реализация связанного списка. Что касается проблем производительности, вы сохраняете последнюю вычисленную длину списка, но при возврате длины, если список был изменен, вы вычисляете его снова, в противном случае вы возвращаете последнее кэшированное значение.

class MyLinkedList
{
public:
  long getLength() const
  {
    if (lengthIsModified())
    {
      mLength = ...; // do the computation here
    }
    return mLength;
  }
private:
  mutable long mLength;
};

Предупреждение: Не всегда легко всегда обновлять данные из-за некоторых определенных операций (например, слияние) в списке.

Ответ 11

Ключевое слово mutable позволяет изменять переменную в контексте 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;
}