2009-10-30 62 views
1

假設我想讓一個類中的一個變量總是與另一個變量處於某種關係,而不顯式地更改「鏈接」變量。在C++的類中鏈接2個變量的方法

例如:int foo總是比int小10。

這樣做,如果我改變了酒吧,foo也會改變。有沒有辦法做到這一點? (整數溢出是不是真的有可能,所以不要擔心。)

例子:(顯然是行不通的,但一般代碼的理解)

class A 
{ 
    int x; 
    int y = x - 10; // Whenever x is changed, y will become 10 less than x 
}; 
+0

C++有像PHP中一樣通過引用實例化變量嗎?你可以實例化y來獲得對x-10的引用,所以當x改變時,x-10也改變爲y。 – 2009-10-30 00:39:32

+0

我會建議James的解決方案只使用一個變量。如果由於某種原因你不能這樣做,訪問控制(私人成員)可以幫助你執行這個不變量,因爲在課堂外沒有人可以與x和y混在一起。 – sellibitze 2009-10-30 06:50:44

回答

8

不,你不能去做。這樣做你最好的選擇是使用存取和mutator成員函數:

int getFoo() 
{ 
    return foo_; 
} 

void setFoo(int newFoo) 
{ 
    foo_ = newFoo; 
} 

int getBar() 
{ 
    return foo_ + 10; 
} 

void setBar(int newBar) 
{ 
    foo_ = newBar - 10; 
} 
+0

我不想明確地做。 – trikker 2009-10-30 00:04:02

+0

這是唯一的方法...... – EToreo 2009-10-30 00:05:11

+0

好的,謝謝你的迴應。我想我會找出一些東西。 – trikker 2009-10-30 00:09:07

3

這就是所謂不變。這是一種應該保持的關係,但不能通過編程語言提供的手段強制執行。不變量只有在真正有必要時才應該引入。在某種程度上,這是一個相對「不好」的事情,因爲它們可能會被無意中破壞。所以,你必須問自己的第一個問題是你是否真的需要引入那個不變量。也許你可以在這種情況下沒有兩個變量,就像詹姆斯在他的回答中所建議的那樣,可以從第一個變量中隨時生成第二個值。但是如果你確實需要兩個變量(而且經常沒有辦法解決這個問題),那麼你最終會得到一個不變的結果。當然,可以用C++手動實現某些東西,這些東西可以將變量有效地鏈接在一起,並在其他變化時改變它們,但大多數時候不值得這樣做。如果你真的需要兩個變量,你可以做的最好的事情是,要小心地手動保持所需的關係,並使用大量的斷言來驗證不變量,只要它可以中斷(有時甚至不能) ,就像

assert(y == x - 10); 

你的情況。另外,我希望有一些高級的第三方C++庫(例如Boost)提供一些高級斷言工具,這些工具可以被自定義編程以監視代碼中的不變量(我不能儘管如此),也就是說,你可以在這裏爲你工作,但它必須是一個圖書館解決方案。核心語言在這裏不會幫助你。

+0

+1但我認爲你應該在班級和私人成員上添加一些關於你的答案。訪問控制有助於實施不變量。 – sellibitze 2009-10-30 06:48:09

2

您可以創建一個新的結構,其中包含兩個變量並使您希望使用的操作符過載。類似於上面的James McNellis的答案,但是隻要您對相關變量進行操作,就可以讓它「自動」發生。

class DualStateDouble 
{ 
public: 
    DualStateDouble(double &pv1,double &pv2) : m_pv1(pv1),m_pv2(pv2) 
    // overload all operators needed to maintain the relationship 
    // operations on this double automatically effect both values 
private: 
    double *m_pv1; 
    double *m_pv2; 
};