Вы можете перегрузить присвоение только для класса. Но вы можете сделать эту переменную типом класса с перегруженным присваиванием, например:
class Monitor {
class Monitored {
double x;
public:
Monitored &operator= (double v) {
std::cout << "Assigned " << v << std::endl;
x = v;
return *this; // don’t forget this!
}
operator double() const {
std::cout << "Accessed " << x << std::endl;
return x;
}
};
Monitored val;
};
Вам может потребоваться перегрузить больше операторов, а также передать ссылку на Monitor
в val
( вместо этого есть приемы для его вычисления, если у вас мало памяти).
Вы можете (в современном C ++) даже перегрузить оператор &
, но если функция API не является шаблоном, она должна вернуть указатель. Наблюдение за доступом через него очень зависит от среды c.
Во время отладки вы обычно можете установить точку наблюдения памяти, которая будет приостанавливать выполнение программы при записи или даже при чтении из определенной области памяти ( для GDB см. Настройка точек наблюдения ; VS должен иметь аналогичную функцию). Для этого требуется аппаратная поддержка (или безумно медленный интерпретатор-отладчик), поэтому общее количество точек наблюдения часто очень ограничено.
Без отладчика вы можете создать часы с одним выстрелом, используя Трюки защиты памяти (например, защита страницы, содержащей переменную, и снятие защиты с нее при первом SEGV), но это слишком просто для agile для обычного использования.