我正在用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整数的值 - 但我不知道如何修复它。
答案 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;