Самый простой способ изменить значение переменной const - PullRequest
0 голосов
/ 09 октября 2019

Для моего класса CS у меня есть переменная const int m_vin, во всем коде мне необходимо отредактировать это значение. У меня сложилось впечатление, что const переменные нельзя редактировать. Как бы я поступил об этом?

Редактировать: Вот указания для m_vin, который является переменной-членом объекта с именем Vehicle: m_vin, const int, который представляет уникальный VIN-идентификационный номер транспортного средства (нетдва автомобиля могут существовать с одним и тем же m_vin).

В моей программе мне необходимо отредактировать m_vin;

Ответы [ 6 ]

3 голосов
/ 09 октября 2019

Вы не.

В этом весь смысл.

3 голосов
/ 09 октября 2019

Предостережение: Изменение значения такого объекта, независимо от метода, используемого для этого, является причиной неопределенного поведения.

Вы можете использовать:

int& ref = const_cast<int&>(m_vin);
ref = <new value>;

Не вините меня, если ваш компьютер взорвался.


Будет лучше изменить переменную на не-1011 *.

int m_vin;

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

0 голосов
/ 10 октября 2019

Для моего класса CS у меня есть переменная const int m_vin, во всем коде мне необходимо отредактировать это значение. У меня сложилось впечатление, что переменные const нельзя редактировать. Как бы я поступил об этом?

Как уже отмечали другие, вы не можете, по крайней мере, не напрямую. И даже не стоит пытаться программировать.

Вот указания для m_vin, который является переменной-членом объекта с именем Vehicle: m_vin, const int, представляющий уникальный VIN – VehicleИдентификационный номер (никакие два транспортных средства не могут существовать с одним и тем же m_vin).

Скорее всего, ваш инструктор попросит вас построить разные объекты с разными const int m_vin. Если вы делаете это, вам не нужно редактировать их после создания, так как каждый объект инициализируется с другим vin.

В моей программе мне необходимо отредактировать m_vin;

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

Один из способов сделать это - использовать размещение new вместе с конструктором, который имеет все значения, необходимые для инициализации объекта. Сначала сохраните копии всех значений в объекте локально. Используйте std::move для динамических значений. Далее вызываем деструктор на объекте. Затем используйте размещение с новым списком аргументов, необходимым для восстановления объекта с новым значением const.

Следующий код заменяет m_vin другим значением.

#include <memory>
#include <string>


struct Foo {
    const int m_vin;
    std::string stuff;
    Foo(int m_vin_, std::string stuff_) : m_vin{ m_vin_ }, stuff{ stuff_ } {}
    ~Foo() {}
};

int main()
{
    Foo foo1(1, "SomeString");
    int ci = 42  // modify ci
    std::string stuff = foo1.stuff;
    foo1.~Foo();                // in case there is any dynamic objects in Foo
    new(&foo1) Foo(ci, stuff);
    std::string x = foo1.stuff;
}

Но будьте осторожны. Вы также должны использовать std::launder, чтобы гарантировать, что член const будет прочитан правильно. Этот вид взлома, хотя и легальный (я думаю), вредит читабельности кода. Люди, читающие код, будут разумно предполагать, что переменные-члены const не изменятся после их создания. Так что не делайте этого, кроме как успокоить инструктора странным запросом.

0 голосов
/ 09 октября 2019

Не делай этого. Всегда. Как заявлено Р. Саху, вы можете попытаться const_cast удалить константу. Тем не менее, это не единственный охранник, чтобы сражаться. Иногда (особенно если это элемент, определяемый глобальной областью), страница памяти, содержащая элементы const, может быть помечена ОС как доступная только для чтения (я встречал такую ​​вещь в Win XP). Таким образом, ваша попытка изменить элемент const_cast может закончиться нарушением прав доступа или подобным.

Еще раз: НЕ делайте этого.

0 голосов
/ 09 октября 2019

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

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

0 голосов
/ 09 октября 2019

"Для моего класса CS у меня есть переменная const int m_vin, во всем моем коде мне необходимо отредактировать это значение."- Не делай этого. Вы будете вызывать неопределенное поведение.

Создать копию. Отредактируйте копию. Сохраните копию обратно "куда угодно".

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...