2012-12-17 110 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