c ++ - выражение не оценивается как константа - используется константа из другого класса - PullRequest
1 голос
/ 05 марта 2019

[мой код довольно большой, поэтому я вставил только те части, которые показались мне подходящими, просто скажите, если вам нужно больше узнать об этом, спасибо]

Я определил константу в классе (Анимация) но теперь я разделил класс на две части (AnimationsDefinition & AnimationsInstance), я не могу использовать эту константу от одного класса к другому

Я включил AnimationsDefinition.h перед AnimationsInstance.h

common.h

#include "animationsDefinition.h"
#include "animationsInstance.h"

компилятор жалуется, что константа не может быть оценена

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

ошибка, которую я получаю:

error C2131: expression did not evaluate to a constant
note: failure was caused by non-constant arguments or reference to a non-constant symbol
note: see usage of 'EAST'

AnimationsDefinition.cpp

#include "common.h"

const int AnimationsDefinition::WEST    = 0;
const int AnimationsDefinition::SOUTH   = 1;
const int AnimationsDefinition::NORTH   = 2;
const int AnimationsDefinition::EAST    = 3;

...

AnimationsDefinition.h

#pragma once

class AnimationsDefinition
{
public:
    static const int WEST;
    static const int SOUTH;
    static const int NORTH;
    static const int EAST;
    ...

AnimationsInstance.cpp

#include "common.h"

void AnimationsInstance::update(float tpf)
{
    switch (direction)
    {
        case AnimationsDefinition::EAST: <<<<<<<<< compilation error
        {
            ...

Любая помощь приветствуется

С уважением

Ответы [ 2 ]

2 голосов
/ 05 марта 2019

Вы можете инициализировать переменные static const внутри самого класса.

class AnimationsDefinition
{
public:
    static const int WEST = 0;
    static const int SOUTH = 1;
    static const int NORTH = 2;
    static const int EAST = 3;
};

Однако вы хотите определить их правильно, если хотите избежать нарушений ODR.

Поэтому используйте спецификатор constexpr, который подразумевает inline для static членов данных,И inline static члены данных могут быть определены в самом определении класса.

class AnimationsDefinition
{
public:
    static constexpr int WEST = 0;
    static constexpr int SOUTH = 1;
    static constexpr int NORTH = 2;
    static constexpr int EAST = 3;
};

Согласно [class.static.data] / 3 :

Встроенный статический член данных может быть определен в определении класса и может указывать инициализатор фигурной скобки или равнозначный.

2 голосов
/ 05 марта 2019

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

Обратите внимание, что перемещение инициализатора в объявление в пределах определения класса в заголовке не превращает объявление в определение переменной. Определения все еще должны оставаться в исходном файле, только без инициализаторов.

Хорошо, я обнаружил, что могу определить их в самом классе, так как они статические

Вы можете определять их в самом классе (или заголовке в целом), только если вы объявите их inline.


Однако для случаев коммутации более привычно использовать (ограниченные) перечисления.

...