Затенение (shadowing) — когда локальная переменная скрывает переменную из внешней области видимости с тем же именемВ классах затенение особенно коварно: локальная переменная или параметр может скрыть член класса. И компилятор промолчит.
class Config {
int timeout_ = 5000;
public:
void setTimeout(int timeout_) { // параметр затеняет член!
timeout_ = timeout_;
// Член класса НЕ изменился
}
};🍉 Способы решения проблемы
class Config {
int timeout_ = 5000;
public:
// 1. Разные имена
void setTimeout(int newTimeout) {
timeout_ = newTimeout;
}
// 2. Явный this->
void setTimeoutAlt(int timeout_) {
this->timeout_ = timeout_;
}
// 3. Через имя класса
void setTimeoutBase(int timeout_) {
Config::timeout_ = {timeout_};
}
// 4. Через временный объект
void setTimeoutDumb(int timeout_) {
*this = { .timeout = timeout_ };
// Но лучше так не писать
}
};❗️ Включите -Wshadow-field для отлова таких багов.
📍Навигация: Вакансии • Задачи • Собесы
Библиотека C/C++ разработчика
#константная_правильность