C ++-表达式未求出常量-使用其他类的常量

时间:2019-03-05 10:21:40

标签: c++ class constants

[我的代码非常安静,所以我只粘贴了与我相关的部分,只是告诉我是否需要查看更多内容,谢谢]

我在一个类(动画)中定义了一个常量,但是现在我将该类拆分为两个类((AnimationsDefinition和AnimationsInstance)),我不能从一个类到另一个类使用该常量

我在AnimationsInstance.h之前加入了AnimationsDefinition.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 个答案:

答案 0 :(得分:2)

const变量只能在遇到初始化程序后才能用作常量表达式。在这种情况下,可以通过将初始化程序移动到标题中来实现。

请注意,将初始化程序移动到标头中类定义内的声明中不会使该声明成为变量的定义。这些定义必须仍然保留在源文件中,而无需初始化程序。

  

好吧,我发现我可以在类本身中定义它们,因为它们是静态的

仅当您声明inline时,才可以在类本身(或通常的标头)中定义


但是,在切换案例中使用(作用域)枚举更为常规。

答案 1 :(得分:2)

您可以在类本身内初始化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

  

可以在类定义中定义内联静态数据成员,并可以指定大括号或相等初始化器。