2010-08-17 157 views
1

我有一個結構:C++重新定義變量不變

 
struct s 
{ 
    UINT_PTR B_ID; 
}; 
s d; 
d.B_ID=0x1; 

這工作正常,但我想d.B_ID恆定。我試圖使用(const),但它不起作用。所以在我給d.B_ID賦值之後,我想讓它成爲一個常量。

任何想法?


編輯

好吧我不希望整個結構恆定。
當我設置計時器並使用b.B_ID作爲計時器的想法。
在 開關(WPARAM) { 情況b.B_ID //錯誤:B_ID必須是恆定的 .... 中斷; } 所以這就是爲什麼我需要它是一個常數

+0

如果您想了解一下您嘗試實現的目標,那將會有所幫助。你有幾個答案可以回答你關於結構的const成員的原始問題,但實際上並沒有用,因爲我們不知道你想在switch語句中使用它。 http://catb.org/esr/faqs/smart-questions.html#goal – Peter 2010-08-17 23:38:20

回答

3

變量修飾符在編譯時固定爲每個變量。你可能不得不解釋你想要做的事情的背景,但也許這會滿足你的需求?

struct s 
{ 
    int* const B_ID; 
}; 

int main (void) { 
    int n = 5; 
    s d = {&n}; 
    int* value = d.B_ID; // ok 
    // d.B_ID = &n; // error 
    return 0; 
} 

由於您使用C++,我會建議:

class s { 
public: 
    int* const B_ID; 

    s (int* id) : 
    B_ID (id) { 
    } 
}; 

void main (void) { 
    int n = 5; 
    s my_s_variable = s(&n); 

    int* value = my_s_variable.B_ID; // ok 
    //my_s_variable.B_ID = &n; // error 
    return 0; 
} 

Ramiz Toma以及我需要的方式使用s.B_ID =東西

在C/C做++型修飾符(如const)在運行時爲給定類型聲明,並且在運行時不能更改。這意味着如果一個變量被聲明爲const它永遠不能被分配給使用賦值操作符。它只會在構建時被分配一個值。

然而,這不是一個問題,因爲你可以通過適當的設計來解決這個問題。

如果你說你需要使用賦值,我認爲這是因爲你在知道變量的值是什麼之前創建結構。如果是這種情況,那麼你只需要將結構聲明移到知道該值之後。

例如

s d; //variable declaration 

//calculate B_ID 
//... 
int* n = 5; 
//... 


d.B_ID = &n; 

這是行不通的,因爲如果你想b.D_ID是「未分配」,它會永遠是這樣。您將需要類似的重構代碼到:

//calculate B_ID 
//... 
int* n = 5; 
//... 


s d (&n); 
//good 
+0

我試過第一個。它給了我一個錯誤,說無法爲B_ID設置值 – Ramilol 2010-08-17 05:25:35

+0

第二個沒有工作太多的錯誤 – Ramilol 2010-08-17 05:27:38

+0

@Ramiz托馬:我剛剛給出了一個粗略的例子......我現在已經修復它的編譯來編譯爲你。 – Akusete 2010-08-17 05:34:32

3
struct s 
{ 
    s() : B_ID(0){} 
    UINT_PTR const B_ID; 
}; 
int main(){ 
    s d; 
    d.B_ID=0x1; // error 
} 

編輯:對不起,這裏是用C更新程式碼++

struct s 
{ 
    s(UINT_PTR const &val) : B_ID(val){} 
    UINT_PTR const B_ID; 
}; 
int main(){ 
    s d(1); 
    d.B_ID=0x1; // error 
} 
+0

這應該表明什麼? – Shaihi 2010-08-17 05:27:07

+1

對我來說看起來很完美。從這個原始提問者應該能夠輕鬆提取替代品。 chubsdad選擇0而不是1的事實是無關緊要的。 – 2010-08-17 05:32:08

+1

@Martin:現在它已經修復好了。 – 2010-08-17 05:43:25

1

你不能做到這一點 - 即。不可能選擇性地創建一個struct const的單個成員。一種選擇是「constify」整個結構:

s d; 
d.B_ID=0x1; 
const s cs = s; // when using this B_ID won't be modifiable - but nor would any other members 

或者你也可以在施工設置:

struct s 
{ 
    s(UINT_PTR const p): B_ID(p) {} 
    UINT_PTR const B_ID; 
};  
s d(0xabcdef); 
+0

你的第二個例子與你的第一個陳述相矛盾嗎? – 2010-08-17 05:30:49

+0

是的,它確實 - 但仍然是第二個例子是正確的做法。 – 2010-08-17 05:34:01

+0

以及我使用第二個錯誤 錯誤2錯誤C2064:術語不計算爲一個函數帶1個參數 – Ramilol 2010-08-17 05:48:04

0

另一種方法是一個getter和一個時間設定

class s 
{ 
private: 
    bool m_initialized; 
    UINT_PTR m_value; 
public: 
    s() : m_initialized(false), m_value(NULL) {} 
    s(UINT_PTR value) : m_initialized(true), m_value(value) {} 

    //no need for copy/assignment operators - the default works 

    inline UINT_PTR GetValue() const { return m_value; } //getter 

    bool SetValue(UINT_PTR value) //works only one time 
    { 
     if (m_initialized) 
     { 
      m_value = value; 
      m_initialized=true; 
      return true; 
     } 
     else 
     { 
      return false; 
     } 
    } 

    inline bool IsInitialized() const { return m_initialized; } 
}; 
3

在C++語言中,case標籤必須由積分常量表達式(ICE)構建。 ICE就是編譯器在錯誤信息中的「常量」一詞所暗示的含義。 ICE中不能使用類的非靜態成員。從字面上理解你正在做的事情是不可能的。即不可能在case標籤中使用結構成員。

在這種情況下忘記switch/case。使用普通的if分支而不是switch語句。