2013-02-01 41 views
3

我有一個愚蠢的問題!讓我們假設你有一個全局變量,用於各地的項目,你會當它改變時,例如調用函數做一些事情。
一個簡單的方法是調用函數每次改變後。但是,如果這個全局變量是圖書館的一部分,並且會在外部使用,那麼該怎麼辦?是否有更好的解決方案?如何找出全局變量在C++中是否發生了變化?

+0

可以在一些需要回調對轉讓的形式稱之爲包裹。 – chris

+1

你想在變化的瞬間做點什麼?爲什麼不把變量包裝在一個簡單的類中,並在調用者被調用時註冊一個回調函數? –

+0

你可以嘗試使用觀察者模式。 – andre

回答

8

想必您希望在變量被修改追查曾經提到它和重寫所有的代碼依賴於它找到。

爲了做到這一點,您的變量從不管它現在是到該超載operator=,並打印/日誌/當它發生任何變化的類的類型而改變。例如,假設您目前有:

int global; 

,想知道發生更改時global發:

class logger { 
    int value; 
public: 
    logger &operator=(int v) { log(v); value= v; return *this; } 

    // may need the following, if your code uses `+=`, `-=`. May also need to 
    // add `*=`, `/=`, etc., if they're used. 
    logger &operator+=(int v) { log(value+v); value += v; return *this; } 
    logger &operator-=(int v) { log(value-v); value -= v; return *this; } 
    // ... 

    // You'll definitely also need: 
    operator int() { return value; } 
}; 

logger global;更換int global;得到一個日誌的所有更改global

2

你需要做一個訪問函數來設置全局變量。然後,您可以從該訪問器中調用您的特殊功能,而不是要求所有的調用者自行完成。

4

我想說的最簡單的方法是創建您的變量設置方法調用該函數,並讓它成爲市民,而變量本身的私密性:

//public 
void setYourVariable(int newValue) 
{ 
    YourVariable = newValue; 
    YourFunction(); 
} 
//private 
int YourVariable; 
+2

'私人詮釋YourVariable'是無效的C++;) –

1

只是爲了回答這個問題,實際:不,在C++中沒有辦法確定「變量何時變化」。從技術上講,如果你有足夠的特權並且硬件支持它,你可以爲變量的地址設置一個「寫入斷點」。但是,這只是一種非常迂迴的方式,通過重命名變量來實現一件很容易實現的事情,然後修復變量被訪問的所有位置以調用函數來更新該值,並且如果合適的話還在相同的位置調用函數時間 - 正如幾個答案中所建議的。

0

由於u的說這可能會從出方也稱,凱文說,這是好事,有get()和套裝(...)方法。主要有2個優點。 1)通過設置你可以調用一個函數,或者在值改變時執行操作。 2)你可以避免直接將你的變量暴露給外部。