我有一個愚蠢的問題!讓我們假設你有一個全局變量,用於各地的項目,你會當它改變時,例如調用函數做一些事情。
一個簡單的方法是調用函數每次改變後。但是,如果這個全局變量是圖書館的一部分,並且會在外部使用,那麼該怎麼辦?是否有更好的解決方案?如何找出全局變量在C++中是否發生了變化?
3
A
回答
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)你可以避免直接將你的變量暴露給外部。
相關問題
- 1. 如何檢測變量是否發生了變化?
- 2. 如何使方法檢測變量是否發生了變化?
- 3. 如何檢查是否變量的值發生了變化
- 4. 全局變量的值發生了變化,javascript
- 5. C++全局變量超出了範圍
- 6. 要找出一個* .aspx頁面是否發生了變化
- 7. 瞭解哪個表在全局領域發生了變化ChangeListener
- 8. C中的全局變量是否始終初始化爲零?
- 9. 我的代碼出了什麼問題?當使用信號量時,全局變量值發生了變化
- 10. 查找鼠標在mousedown期間是否發生了變化
- 11. 在C初始化的全局變量++
- 12. 全局變量在生產
- 13. 檢測一個變量是否在不同的函數中發生了變化
- 14. 檢查redis變量在nodejs中是否發生了外部變化
- 15. 如何判斷Postgres中的記錄是否發生了變化
- 16. 如何檢查頁面中是否發生了變化?
- 17. C++全局變量
- 18. 全局變量,C
- 19. C#全局變量
- 20. C++:全局變量
- 21. 初始化全局常量變量是否安全?定義?
- 22. JS局部變量全局變化
- 23. 如何在全局變量C#
- 24. python全局變量在這裏發生了什麼?
- 25. C:全局,靜態變量了解
- 26. EXT JS中是否有全局變量
- 27. grunt中是否有全局變量?
- 28. C#中的全局變量
- 29. C++中的全局變量
- 30. C中的全局變量#
可以在一些需要回調對轉讓的形式稱之爲包裹。 – chris
你想在變化的瞬間做點什麼?爲什麼不把變量包裝在一個簡單的類中,並在調用者被調用時註冊一個回調函數? –
你可以嘗試使用觀察者模式。 – andre