C++类枚举成员变量
我有一个具有枚举类型GameStates的类。在(公共)构造我初始化GameStates这样的:C++类枚举成员变量
GameStates enumGameState = Ready;
在一个公共的方法运行
然后()我有一个这样的开关:
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
感谢您的帮助球员。问题不在于班级,而是班级的代码。这是一个视觉工作室的问题,我不知道什么不幸。当代码被拷贝出来并添加到一个新的项目中时,它编译得很完美,并且所有放置在main中的断点都被命中。
故事的道理:尝试显而易见的第一个。
如果你的构造函数有下面的代码行,逐字:
GameStates enumGameState = Ready;
那么你刚刚做的是你的构造方法中创建本地变量enumGameState
并初始化它。一旦构造函数完成,它就超出范围,并且其值将丢失。
想必你也有一个成员变量enumGameState
,其值是未初始化的,所以你switch
语句与假值运行。
创建与成员变量名称相同的局部变量是C++中 shadowing的一个示例,它通常表示出现错误。出于这个原因,如果你隐藏一个变量,一些编译器(比如GCC)会显示警告;详情请参阅this answer。
GameStates的实例在类的顶部定义为enumGameState,只在构造函数中设置为Ready。 – 2012-02-05 19:37:31
@Stephen - 然后我不确定问题是什么。没有看到实际的代码很难说。 – 2012-02-05 19:44:44
大规模失败,偶然添加了所有代码,然后尝试通过编辑帖子将其删除,并以两次结束。 :(对不起 PS,可以请一个模去除多余的代码呢? – 2012-02-05 19:58:25
你才能用它来定义此枚举:
enum GameState
{
Ready,
Firing,
Contact,
Over
};
那么类Game
看起来是这样的:
class Game
{
public:
Game(GameState gs = Ready) : gs(gs) { }
void update()
{
switch (gs)
{
case Ready: cout << "Ready\n"; gs = Firing; break;
case Firing: cout << "Firing\n"; gs = Contact; break;
case Contact: cout << "Contact\n"; gs = Over; break;
case Over: cout << "Over\n"; 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
我有一个公共枚举GameStates定义,已经是它的一个实例。我有一个名为enumGameState,我这个分配在构造函数中准备值也是公开的,我试图在方法中使用相同的类变量 – 2012-02-05 19:36:00
好吧,似乎你的实现是正确的,但你决定使用枚举而不是'int gameState;';) – LihO 2012-02-05 20:03:18
我想我做得正确,但我不知道为什么我没有得到期望的结果。 我真的很希望我在离开前24小时才离开它,现在重新开始我的任务,尽管调试旧的更糟! – 2012-02-05 20:16:04
我不相信这个类本身有什么问题,我发现当我运行游戏时,main()永远不会进入,所以这个类永远不会存在。这让我陷入了另一个困境,因为那是游戏场景的画面,看起来好像还好。
谢谢你的时间帮助我调试游戏类的代码都一样。
如果你添加std :: endl到你的印刷品来冲洗这条线有帮助吗?'std :: cout 2012-02-05 19:23:29
不,控制台输出中仍然没有任何东西。我已经测试了key_space,不过现在在开关外面,看起来好像按键没有被读取。这是奇怪的看到,因为逃生键捕获工作正常。 – 2012-02-05 19:28:37
对不起,我意识到这不在上面的代码片段。直接在交换机之前,我有另一个theGameEngine-> Key_Hit()作为退出游戏的退出键。完美地工作! – 2012-02-05 19:32:32