Для моего класса 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 не изменятся после их создания. Так что не делайте этого, кроме как успокоить инструктора странным запросом.