2010-08-17 128 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语句。