У меня есть сложная программа со странной ошибкой, что некоторое значение int неожиданно упало до нуля.
, поэтому я хочу отслеживать это значение встроенного типа, тогда я мог бы легко отладить.
чтобы сделать это, я сделал следующий шаблонный класс ValueWatcher, чтобы я мог отслеживать почти изменения значения, кроме случаев, когда ValueWatcher разыменовывается.(я сделал эти операторы разыменования, потому что программе нужны int *, &)
template <typename T>
class ValueWatcher
{
public:
ValueWatcher(const T &val)
{
cout << "constructor with raw value " << val << endl;
_cur = _old = val;
}
ValueWatcher(const ValueWatcher& vw)
{
cout << "constructor with ValueWatcher " << vw._cur << endl;
_cur = vw._cur;
}
ValueWatcher& operator=(const ValueWatcher &rhs)
{
cout << "operator= with ValueWatcher " << rhs._cur << endl;
_cur = rhs._cur;
onChanged();
return *this;
}
ValueWatcher& operator=(const T &val)
{
cout << "operator= with " << val << endl;
_cur = val;
onChanged();
return *this;
}
int *operator&()
{
cout << "addressing operator" << endl;
// can't track anymore!!!!!!!!!!!!!!!!!!!!!!!!!
return &_cur;
}
operator int&()
{
cout << "operator int&" << endl;
// can't track anymore!!!!!!!!!!!!!!!!!!!!!!!!!
return _cur;
}
operator int&() const
{
cout << "const operator int&" << endl;
return _cur;
}
operator int() const
{
cout << "operator int" << endl;
return _cur;
}
private:
void onChanged()
{
// update old and do proper action
}
T _cur;
T _old;
};
проблема в том, что когда клиентский код хочет int & или int * для ValueWatcher, он может в любом случае дать int & или int *но - int * или & не может содержать экземпляр ValueWatcher, поэтому не может больше отслеживать.
Есть ли способ решить эту проблему?Я думаю, что это можно решить, возвращая ссылку или экземпляр класса указателя, а не просто возвращая & или * встроенного типа.но я не знаю, как это сделать.
Кроме того, я не могу запустить эту программу с отладчиком.проблема возникает только в РЕАЛЬНОЙ среде и очень трудно воспроизвести.