![](/img/trans.png)
[英]C++: How can I make two classes declared on the same .cpp “see” each other at compile time?
[英]How can i make two values constrain each other consistently?
我有兩個變量, static int16_t min
和static int16_t max
。
我想讓他們互相約束,這樣
min
永遠不會大於max
,並且max
永遠不會小於min
。此外,每個值都需要限制在 0 - 15 的值范圍內(變量被聲明為 int16_t,因為除了這個特定實例的范圍之外,它們還有多種用途)。
我嘗試了以下代碼:
min = constrain(min, 0, max);
max = constrain(max, min, 15);
這適用於min
的值,意思是:一旦min
增加到max
它就不會增加超過max
的值。 另一方面,當max
的值減小到等於min
的值時,它會不斷減小兩個值,直到它們都減小到 0。
我很難弄清楚如何解決邏輯,並且希望能夠使邏輯對兩個 values 保持一致的任何建議,因此換句話說,我可以使用以下解決方案:
簡短的回答:封裝。
你所描述的是一個不變量。 不變量由用戶定義的數據類型通過封裝私有數據來保證,並且只為用戶提供對將不變量作為后置條件的方法的訪問。
僅概述想法:
class min_max {
int min;
int max;
void normalize_min() { if (min > max) min = max; }
void normalize_max() { if (max < min) max = min; }
public:
min_max(int a,int b) : min(std::min(a,b)), max(std::max(a,b)) {}
void set_min(int x) {
min = x;
normalize_max();
}
void set_max(int x) {
max = x;
normalize_min();
}
int get_max() { return max; }
int get_min() { return min; }
};
從課堂外,無法達到max < min
。
考慮 Yakk 對您的問題的評論。 我不確定你真正想要什么,對於上面我假設在調用mm.set_max(a)
我們可以斷言mm.get_max() == a
並且只有min
被調整(反之亦然set_min
)。 其他解決方案也是可能的,例如,當用戶嘗試設置大於min
的max
或以不同方式發出錯誤信號時,您可以拋出異常。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.