У меня есть 4 переменных: x y z i.
Каждая из переменных, каждый раз перезаписывается из-за принятий сообщений от сервера. Как запретить перезапись переменных x и y? Т.е. 1 раз он записывает, следующие разы, нет.
Вероятно, это уже не должны быть просто переменные и нужно писать какой-то «обвес». Самый элементарный — добавить условие. Например:
bool xset = false; // где-то на внешнем уровне
if (!xset) {
x = newx;
xset = true;
}
Чуть посложнее — обернуть в функцию:
void setX(int newx) {
static bool xset = false;
if (!xset) {
x = newx;
xset = true;
}
}
Можно вовсе обернуть в класс переменную x и перегрузить оператор присваивания, в котором реализовать упомянутую выше логику и т.д.
Можно логику обернуть в класс, вроде такого:
template<typename T>
class SetOnce
{
public:
SetOnce() = default;
// Это оператор присваивания. Он будет вызываться при каждой
// попытке записи в переменную.
SetOnce<T> &operator=(const T &value)
{
// Если переменная ещё не записана, то записываем.
// Иначе -- оставляем старое значение.
if ( !m_isSet ) {
m_isSet = true;
m_value = value;
}
return *this;
}
operator T() const
{
return m_value;
}
private:
T m_value = T();
bool m_isSet = false; // Это "флажок".
};
Потом его можно использовать так:
int main()
{
// Делаем переменную типа int, в которую можно записать значение
// только один раз.
SetOnce<int> i;
i = 10;
std::cout << i << std::endl;
// Выведет 10.
i = 20;
std::cout << i << std::endl;
// Всё ещё 10, т.к. 20 не было записано.
return 0;
}
Сборка персонального компьютера от Artline: умный выбор для современных пользователей