c ++将变量重新定义为常量

时间:2010-08-17 05:18:58

标签: c++ visual-c++ winapi constants

我有一个结构:

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

工作正常,但我希望d.B_ID保持不变。我尝试使用(const)但它没有用。所以在我把一个值放到d.B_ID之后,我想把它变成一个常数。

有什么想法吗?

<小时/> EDIT

好吧我不希望整个结构不变。
当我设置计时器并使用b.B_ID作为计时器的想法 在里面 开关(WPARAM) { case b.B_ID // error:B_ID必须是常量 .... 打破; } 所以这就是为什么我需要它成为一个常数

5 个答案:

答案 0 :(得分: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,则永远不会将其赋值给使用赋值运算符。它只会在构造时被赋值。

这不是问题,因为你可以通过适当的设计来解决这个问题。

如果你说你需要使用赋值,我认为这是因为你在知道变量的值之前创建了结构。如果是这种情况,那么您只需要在知道值之后移动struct声明。

例如

s d; //variable declaration

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


d.B_ID = &n;

这不起作用,因为如果你想让b.D_ID为'un assignable',那么它总是如此。您需要以下列方式重构代码:

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


s d (&n);
//good

答案 1 :(得分: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
}

答案 2 :(得分:3)

在C ++语言中,必须使用积分常量表达式(ICE)构建case标签。 ICE是编译器在错误消息中的术语“常量”下所暗示的内容。类的非静态成员不能在ICE中使用。你不可能按照字面意思去做你想做的事情。即不能在case标签中使用结构成员。

在此上下文中忘记switch / case。使用普通if分支代替switch语句。

答案 3 :(得分:1)

你做不到 - 即。不可能选择性地创建struct const的单个成员。一种选择是“满足”整个结构:

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);

答案 4 :(得分:0)

另一种方式是吸气剂和一次性定位器

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; }
};