C++两个源文件之间共享的枚举的静态实例



我在做一个游戏。我有两个源文件,game.cpp和renderHandler.cpp。我有一个头文件,gameState.h。该 gameState.h 文件包含表示不同游戏状态的枚举的静态实例。

我想与两个源文件共享此静态变量。我不希望每个源文件中有两个单独的变量。如果我更改游戏状态变量的值,我希望它传输到另一个源文件。

游戏状态.h

#pragma once
enum State {
start,
play,
stop
} static gameState;

游戏.cpp

#include "../inc/gameState.h"
void Game::init()
{
gameState = State::play;
}

渲染处理程序.cpp

#include "../inc/gameState.h"
void RenderHandler::render()
{
if (gameState == State::start) {
// code
}
else if (gameState == State::play) {
// code
}
else if (gameState == State::stop) {
// code
}
}

游戏状态的值在游戏.cpp文件中更改。但这并不影响 renderHandler.cpp 中 gameState 的值,它默认为 0,这是我不想要的。值更改发生在执行任何呈现代码之前。

如何在两个源文件之间共享枚举的静态实例?我的逻辑是错误的,我不应该以这种方式使用标头和枚举吗?

不要像这样直接共享全局值。您可能会遇到静态初始化顺序惨败,这真的很难检测到。

请改用函数:

enum State {
start,
play,
stop
};
inline State& gameState() {
static State currentState;
return currentState; // Returns a reference, so you can change the value when you need to
}

游戏.cpp

#include "../inc/gameState.h"
void Game::init()
{
gameState() = State::play;
}

渲染处理程序.cpp

#include "../inc/gameState.h"
void RenderHandler::render()
{
if (gameState() == State::start) {
// code
}
else if (gameState() == State::play) {
// code
}
else if (gameState() == State::stop) {
// code
}
}

顺便说一句,你没有得到你所期望的,因为static的含义在全球范围内是不同的。阅读静态与全局和什么是外部链接和内部链接?

你的逻辑是错误的,如果你在头文件中声明一个静态变量,并从两个不同的C++文件中包含它,那么你得到的是一个静态变量的两个实例,具有相同的名称,但不使用相同的内存地址。

为了使用一个实例,你要么需要使用全局变量(不好,因为它使代码难以维护(,使用单例(更好,但仍然应该避免,因为它也很难维护(,或者只是在程序开始时创建此状态变量的一个实例,然后在构造函数中使用它的类中提供对它的引用。

"static" 在全局变量上没有任何意义。您应该将全局变量标记为"extern",并将其初始化添加到游戏状态中.cpp

页眉: 外部状态游戏状态;

CPP: 状态游戏状态 =*初始枚举值;

并将此 CPP 添加到项目的编译中。

注意:它只会在同一模块中按预期工作,如果您将 gamestate.cpp 添加到另一个模块,它将为模块创建本地的新全局变量。

相关内容

  • 没有找到相关文章

最新更新