c ++ - 表达式没有计算为常量 - 使用来自另一个类的常量

问题描述 投票:1回答:2

[我的代码很安静,所以我只粘贴了与我相关的部分,只要告诉我你是否需要看到更多,谢谢]

我在类(动画)中定义了一个常量,但现在我将该类拆分为两个(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
        {
            ...

任何帮助赞赏

问候

c++ class constants
2个回答
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说明符暗示inlinestatic数据成员。并且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
投票

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

请注意,将初始化器移动到标头中类定义中的声明中不会使声明成为变量的定义。定义必须仍保留在源文件中,只是没有初始化者。

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

只有在声明它们inline时,您才可以在类本身(或一般标题)中定义它们。


但是,对于交换机情况使用(范围)枚举更为常规。

© www.soinside.com 2019 - 2024. All rights reserved.