Другие языки программирования и технологии

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

То-есть чтобы пользователь ввел значение и оно становилась константой
#include <iostream>
using namespace std;
template<typename Type>
class my_const {
public:
my_const(const my_const&) = delete;
my_const(my_const&&) = delete;
my_const& operator=(const my_const&) = delete;
my_const& operator=(my_const&&) = delete;
my_const() = default;
Type value()const { return value_; }
private:
Type value_;
bool flag_;
friend istream& operator>>(istream& in, my_const& mc) {
if (mc.flag_) {
in >> mc.value_;
mc.flag_ = false;
}
return in;
}
};
int main() {
my_const<int> x;
cout << ">>> ";
cin >> x;
cin.ignore();
cout << "<<< " << x.value() << endl;
cout << ">>> ";
cin >> x;
cin.ignore();
cout << "<<< " << x.value() << endl;
system("pause");
}
Aбо Байымбеков
Aбо Байымбеков
71 203
Лучший ответ
Смысл этого действия? Пользователь и так не может изменить значение переменной, если больше ввода значения этой переменной не будет.
Принято озвучивать язык программирования.
В памяти компьютера не существует константных переменных. Квалификатор const - это исключительно прерогатива компилятора. На этапе компиляции, все константы могут заменится непосредственными значениями в местах обращений, либо помещаться в специальную секцию .rodata, в которую, при записи, операционная система будет выдавать violation access и аварийно завершать программу.

Вы можете симитировать это поведение, воспользовавшись системными функциями для выделения страниц памяти с модифицированным доступом.

Но гораздо проще сделать это на уровне приложения:
struct once {
int var = 0;
bool isconst = false;
void set(int val)
{
if (isconst) return;
var = val;
isconst = true;
}
};

once var;

//... где-то в main:
var.set(1337); //присвоит var 1337
var.set(404); //уже не присвоит, так как флаг isconst == true
cout << var.var; //выведет 1337

При этом переменной всё же можно установить новое знаечение, если не использовать set. Вполне можно перегрузить оператор "=" для данной структуры и тогда точно не ошибётесь.

В сочитании с шаблонами/макросами, этот пример можно оптимизировать для разных типов данных, а не только для int. Можно так же воспользоваться union.
А обезательно константой?