с ++ переопределить переменную как константу - PullRequest
1 голос
/ 17 августа 2010

У меня есть структура:

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 // ошибка: B_ID должен быть постоянным .... перерыв; } вот почему мне нужно, чтобы она была постоянной

Ответы [ 5 ]

3 голосов
/ 17 августа 2010

На языке C ++ метка case должна быть построена из интегрального выражения константы (ICE).ICE - это то, что компилятор подразумевает под термином «константа» в вашем сообщении об ошибке.Нестатический член класса не может использоваться в ICE.Невозможно делать буквально то, что вы пытаетесь сделать.Т.е. невозможно использовать член структуры в метке case.

Забудьте о switch / case в этом контекстеИспользуйте обычное ветвление if вместо оператора switch.

3 голосов
/ 17 августа 2010
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
}
3 голосов
/ 17 августа 2010

Модификаторы переменных фиксируются во время компиляции для каждой переменной.Возможно, вам придется объяснить контекст того, что вы пытаетесь сделать, но, возможно, это подойдет вашим потребностям?

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чтобы быть «не назначаемым», это всегда будет так.Вам нужно будет рефакторинг вашего кода аналогично:

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


s d (&n);
//good
1 голос
/ 17 августа 2010

Вы не можете этого сделать - т.е.невозможно выборочно сделать один член структуры 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);
0 голосов
/ 17 августа 2010

Другим способом может быть геттер и одноразовый сеттер

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