C++类枚举成员变量
C++ Class Enumeration Member variable
我有一个枚举类型为GameStates的类。在(公共)构造函数中,我初始化GameStates如下:
GameStates enumGameState = Ready;
然后在公共方法run()中,我有一个开关,如下所示:
switch(enumGameState)
{
case Ready:
if (theGameEngine->KeyHit(Key_Space))
{
enumGameState = Firing;
cout << "nGame State moved to Firing";
} // End if
break;
case Firing:
if (theGameEngine->KeyHit(Key_Space))
{
enumGameState = Contact;
cout << "nGame State moved to Contact";
} // End if
break;
case Contact:
if (theGameEngine->KeyHit(Key_Space))
{
enumGameState = Over;
cout << "nGame State moved to Over";
} // End if
break;
case Over:
break;
}; // End of GameState switch
虽然代码没有错误,但没有满足任何状态。我应该如何访问enumGameState的值?
编辑:所有类代码。
class Game
{
private:
Block* arrBlocks[10][10];
//IMesh* objBlockMesh;
IMesh* objGunMesh;
IMesh* objDummyMesh;
Gun* objGun;
int Game::intSpeed;
I3DEngine* theGameEngine;
float fltSkyboxXCo;
float fltSkyboxYCo;
float fltSkyboxZCo;
float fltFloorXCo;
float fltFloorYCo;
float fltFloorZCo;
enum GameStates{Ready,Firing, Contact, Over};
GameStates enumGameState;
public:
Game(I3DEngine* the3dengine)
{
Game::theGameEngine = the3dengine;
theGameEngine->StartWindowed();
// Add default folder for meshes and other media
theGameEngine->AddMediaFolder( "C:\TL-Engine\Media\AssigmentTwo\Media" );
//intSpeed = 1;
Game::DrawBasicScene(theGameEngine);
Game::DrawBlocks();
Game::CreateAGun();
Bullet::Bullet(theGameEngine);
Game::enumGameState = Ready;
} // End of Constructor
private:
void DrawBlocks()
{
float fltBlockOffSet = 12.0f;
float fltLeftMost = -54.0f;
float fltBlockZCo = 120.0f;
float fltBlockYCo = 5.0f;
float fltCurrentXCo;
float fltCurrentYCo = 5.0f;
float fltCurrentZCo = 120.0f;
// Stick 10 blocks in an array
// Display them
for(int i = 0; i < 10; i++)
{
if (i == 1) // Once i have created the first row all the other blocks are going to be created in a hidden state
{
fltCurrentYCo = -50.0f;
}
for(int j = 0; j < 10; j++)
{
fltCurrentXCo = ((float)j*fltBlockOffSet) + fltLeftMost; // Cast j into a float explicitly so that it doesn't it implicitly
arrBlocks[i][j] = new Block(theGameEngine, fltCurrentXCo, fltCurrentYCo, fltCurrentZCo);
if(fltCurrentYCo < 0)
{
arrBlocks[i][j]->SetBlockState(Block::Destroyed);
} // End if
else
{
arrBlocks[i][j]->SetBlockState(Block::New);
}
} // End of inner loop
fltCurrentZCo += fltBlockOffSet;
} // End of outer loop
}
void CreateAGun()
{
// Create a gun
Gun::Gun(theGameEngine);
}
public:
void Game::Run()
{
//Start watching input in a while loop
// The main game loop, repeat until engine is stopped
while (theGameEngine->IsRunning())
{
// Draw the scene
theGameEngine->DrawScene();
if (theGameEngine->KeyHit(Key_Escape))
{
theGameEngine->Stop();
}
if)theGameEngine->KeyHit(Key_Space))
{
cout << "n space";
}
GameStates currentGameState = enumGameState;
switch(enumGameState)
{
case Ready:
if (theGameEngine->KeyHit(Key_Space))
{
enumGameState = Firing;
cout << "nGame State moved to Firing" << endl;
} // End if
break;
case Firing:
if (theGameEngine->KeyHit(Key_Space))
{
enumGameState = Contact;
cout << "nGame State moved to Contact" << endl;
} // End if
break;
case Contact:
if (theGameEngine->KeyHit(Key_Space))
{
enumGameState = Over;
cout << "nGame State moved to Over" << endl;
} // End if
break;
case Over:
break;
}; // End of GameState switch
}
}
}; // End of Game Class
如果您的构造函数有以下代码行,请逐字逐句:
GameStates enumGameState = Ready;
然后,您刚刚完成的是在构造函数方法中创建一个局部变量enumGameState
并对其进行初始化。构造函数一完成,它就超出了作用域,其值也会丢失。
假设您还有一个成员变量enumGameState
,其值未初始化,因此您的switch
语句使用伪值运行。
创建一个与成员变量同名的局部变量是C++中遮蔽的一个例子,它通常指示错误。出于这个原因,一些编译器(如GCC)可能会在对变量进行阴影处理时显示警告;有关详细信息,请参阅此答案。
您必须定义此枚举才能使用它:
enum GameState
{
Ready,
Firing,
Contact,
Over
};
那么类Game
可能看起来像这样:
class Game
{
public:
Game(GameState gs = Ready) : gs(gs) { }
void update()
{
switch (gs)
{
case Ready: cout << "Readyn"; gs = Firing; break;
case Firing: cout << "Firingn"; gs = Contact; break;
case Contact: cout << "Contactn"; gs = Over; break;
case Over: cout << "Overn"; break;
default: break;
}
}
private:
GameState gs;
};
这是main
:
int main()
{
Game g;
g.update();
g.update();
g.update();
g.update();
return 0;
}
输出:
Ready
Firing
Contact
Over
我不认为这个类本身有任何问题,我发现当我运行Game main()时,它从未被输入,因此这个类永远不存在。这让我陷入了另一个困境,因为游戏场景就是在这里绘制的,看起来还不错。
谢谢你花时间帮助我调试游戏类代码。
谢谢你们的帮助。问题不在于类,也不在于类的代码。这是视觉工作室的问题,我不确定不幸的是什么。当代码被复制出来并添加到一个新项目中时,它编译得很完美,所有位于main中的断点都被击中了。
故事的寓意:先试试显而易见的。
相关文章:
- 枚举成员与静态 int 成员?
- 从类访问枚举成员
- 枚举成员不是类型错误
- std::映射键作为模板化结构与枚举成员
- 设置类的枚举成员无效地使用"枚举"
- 如何访问结构和枚举成员形成一类
- 是否可以在 constexpr 函数中遍历枚举成员,因此值为 constexpr
- 获取 [枚举成员?] 的封闭类型
- 如何使用 SWIG 枚举枚举成员
- 通过int值访问枚举成员
- '='应初始化所有枚举成员或仅初始化第一个枚举成员;
- 为什么可以获取此枚举成员值,而不必先深入研究嵌套枚举
- 将具有枚举成员的非托管结构封送到 C#
- 为类模板的枚举成员定义 std::hash
- 缩短C++枚举成员的路径(使用 typedef 或 typename),以用作模板参数
- C++类枚举成员变量
- 检查是否已定义枚举成员
- 为什么要使用这段代码来获取枚举成员的数量?
- 使用枚举成员模板化成员函数
- 使用咬运算符了解枚举成员的初始化