2012-12-17 108 views
2

出于调试的目的,我想找到一种方法如何自动跟踪参与了我的设计变量的变化。C++变量变化监测

我想获得的结果为像每一个变量被分配时间的新值的printf的,但无需手动插入所有的printf。

这样做的最好方法是什么? 感谢

+1

调试器可以做到这一点。你需要在代码中完成吗? – jalf

+0

否则(如果不是调试器方法)您需要确保使用访问器,或者包装所有变量,以便operator =,copy和其他分配方法触发某些输出。 – Caribou

+0

请说你在用什么IDE?我知道在Visual Studio中使用它的几种方法。 –

回答

0

尝试为他们写一些代理类和重新赋值运算符。它colud具有指针或值的语义,但我更喜欢指针,因为它很简单。

template<class T> 
struct proxy 
{ 
//add const version 
    T & operator *() 
    { 
    std::cout << "access" << std::endl; 
    return val_; 
    } 

    T * operator ->() 
    { 
    std::cout << "access" << std::endl; 
    return &val_; 
    } 

    proxy<T> & operator = (T const & other) 
    { 
    std::cout << "access" << std::endl; 
    val = other; 
    return (*this); 
    } 
private: 
    T val_; 
}; 
+0

这有混合的语义。如果你写'代理我',那么'我= 12'和'*我= 12'具有相同的效果。 –

+0

是的,但这是它应该的方式。 * i = x;代理服务器后面的赋值=) – kassak

3

创建要监视和确定适当的operator=赋值运算符方法变量的新类:

template <class T> 
class MonitoredVariable 
{ 
public: 
    MonitoredVariable() {} 
    MonitoredVariable(const T& value) : m_value(value) {} 

    T operator T() const { return m_value; } 

    const MonitoredVariable& operator = (const T& value) 
    { 
     printf("Variable modified\n"); 
     m_value = value; 
     return *this; 
    } 
private: 
    T m_value; 
} 

用法示例:

MoniredVariable<int> x; 
x = 42; // Will print "Variable modified" 

当然,对于这有用,您必须在operator=实现中包含相关信息,并且还必须重载其他算术赋值运算符如+=-=

+1

yuk到printf:P – Caribou