C ++ структуры и константы - PullRequest
       15

C ++ структуры и константы

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

хорошо, у меня есть структура

struct balls {
    balls(UINT_PTR const &val) : BALL_ID(val){}
    int Ex;
    int Ey;
    const UINT_PTR BALL_ID;
};
balls ball1(0x1);

и у меня есть оператор switch

switch(wParam)
        {
        case ball1.BALL_ID:
                if(ball1.Ex<300)
                {
                    ball1.Ex++;
                }
                else
                {
                    KillTimer(hWnd, ball1.BALL_ID);
                }
                InvalidateRect(hWnd, rect, false);
                break;
        case SCORECOUNTER_ID:
                if(life==0)
                {
                    if(scorecounter<1000)
                    {
                        scorecounter+=100;
                        _swprintf(str, _T("Score: %d"), scorecounter);
                        InvalidateRect(hWnd, rect, false);
                    }
                    else
                    {
                        _swprintf(level, _T("Level: %d"), 2);
                        InvalidateRect(hWnd, rect, false);
                    }
                }
            break;
        }

я получаю ошибку, что ball1.BALL_ID не является константой, вторая строка должна решить эту проблему, но она ничего не знает

Ответы [ 3 ]

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

case метки должны быть целочисленными константами - они должны оцениваться во время перевода (т. Е. При компиляции).В этом случае BALL_ID не может быть вычислено во время компиляции.Разным ball объектам разрешено иметь разные BALL_ID значения, поэтому компилятор не может их оценить во время перевода.Кроме того, . (оператор разрешения элементов для объектов) нельзя использовать в метке кейса (т. Е. Даже если вы сделали BALL_ID static, это не сработало бы для вас).рискует предположить, что SCORECOUNTER_ID является макросом / static const int и поэтому может быть оценен компилятором.

Вы можете использовать область имен enum или int, чтобы исправить это.Например:

struct s {
 s(const int t) : x(t) {}
 const int x;
};

namespace s2 {
 const int val = 42;
}

int main() {
 s ss(4);
 int val = 42;
 switch (val) {
  case s2::val:
  break;
  }
}
0 голосов
/ 17 августа 2010

Не каждая постоянная переменная целочисленного типа является константным выражением.Метка регистра оператора switch требует константного выражения.

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

метки case должны быть известны во время компиляции (основное предположение состоит в том, что switch реализован более эффективно, чем последовательность if, знающих значения во время компиляции, используя, например, таблицу переходов). const необходимо, но не достаточно для этого. ball.BALL_ID - это что-то const, которое не известно во время компиляции, поэтому не может быть меткой регистра.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...