错误C3892:您无法分配给const的变量

时间:2015-11-04 16:09:49

标签: c++ const sfml

我正在用C ++制作游戏。我还没有开始编写游戏编码,我正在设置不同的类并制作菜单。这是我第一次制作一个“大”的节目,我发现自己一切都是静态的。当我在我的类中创建静态时,我出于某种原因需要使变量const

error C2864: 'GameWindow::ScreenHeight': a static data member with an in-class initializer must have non-volatile const integral type 

当我把它们变成const时,我又得到了另一个错误:

error C3892: 'ScreenHeight': you cannot assign to a variable that is const

这是我的GameWindow课程:

class GameWindow {
public:
    static sf::RenderWindow mainWindow;

    static void SetScreenWidth(int x);
    static int GetScreenWidth();
    static void SetScreenHeight(int x);
    static int GetScreenHeight();

    static void Initialize();

private:
    static const int ScreenWidth = 1024;
    static const int ScreenHeight = 576;
};

出于某种原因,我不能这样做

void GameWindow::SetScreenHeight(int x) {
    ScreenHeight = x;
}

我知道导致问题的原因 - 我无法更改const整数的值 - 但我不知道如何修复它。

3 个答案:

答案 0 :(得分:2)

只需声明类定义中的变量,然后定义它们:

在头文件中:

class GameWindow {
    /* Whatever here... */

    private:
    static int ScreenWidth;
    static int ScreenHeight;
};

在源文件中:

int GameWindow::ScreenWidth = 1024;
int GameWindow::ScreenHeight = 576;

答案 1 :(得分:1)

  

当我在我的类中创建静态时,我出于某种原因需要使变量为const。

不,你没有。如果希望它们是静态的非const,则需要在.cpp文件中定义它们。

或者更好的是,首先让它们成为非静态的。所有GameWindow共享相同的宽度和高度以及相同的RenderWindow都没有意义。

另外,Initialize方法有什么用?该类的构造函数应该进行初始化。

是时候重新考虑你的设计了。避免使用static,避免使用公共成员变量,避免使用非构造函数初始化方法。 特别是如果这是一个大项目。

答案 2 :(得分:0)

在编写static const int ScreenWidth = 1024;时,您告诉编译器ScreenWidth无法更改。 (然后编译器可以进行各种优化 - 可能完全从代码中消除常量。)

因此,尝试更改它将发出编译器警告。

如果您希望能够更改它,请删除const(以及类声明中的赋值),并使用语句在一个编译单元中定义变量

int GameWindow::ScreenWidth = 1024;