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 
+0

如果你添加std :: endl到你的印刷品来冲洗这条线有帮助吗?'std :: cout 2012-02-05 19:23:29

+0

不,控制台输出中仍然没有任何东西。我已经测试了key_space,不过现在在开关外面,看起来好像按键没有被读取。这是奇怪的看到,因为逃生键捕获工作正常。 – 2012-02-05 19:28:37

+0

对不起,我意识到这不在上面的代码片段。直接在交换机之前,我有另一个theGameEngine-> Key_Hit()作为退出游戏的退出键。完美地工作! – 2012-02-05 19:32:32

感谢您的帮助球员。问题不在于班级,而是班级的代码。这是一个视觉工作室的问题,我不知道什么不幸。当代码被拷贝出来并添加到一个新的项目中时,它编译得很完美,并且所有放置在main中的断点都被命中。

故事的道理:尝试显而易见的第一个。

如果你的构造函数有下面的代码行,逐字:

GameStates enumGameState = Ready; 

那么你刚刚做的是你的构造方法中创建本地变量enumGameState并初始化它。一旦构造函数完成,它就超出范围,并且其值将丢失。

想必你也有一个成员变量enumGameState,其值是未初始化的,所以你switch语句与假值运行。

创建与成员变量名称相同的局部变量是C++中 shadowing的一个示例,它通常表示出现错误。出于这个原因,如果你隐藏一个变量,一些编译器(比如GCC)会显示警告;详情请参阅this answer

+0

GameStates的实例在类的顶部定义为enumGameState,只在构造函数中设置为Ready。 – 2012-02-05 19:37:31

+0

@Stephen - 然后我不确定问题是什么。没有看到实际的代码很难说。 – 2012-02-05 19:44:44

+0

大规模失败,偶然添加了所有代码,然后尝试通过编辑帖子将其删除,并以两次结束。 :(对不起 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 
+0

我有一个公共枚举GameStates定义,已经是它的一个实例。我有一个名为enumGameState,我这个分配在构造函数中准备值也是公开的,我试图在方法中使用相同的类变量 – 2012-02-05 19:36:00

+0

好吧,似乎你的实现是正确的,但你决定使用枚举而不是'int gameState;';) – LihO 2012-02-05 20:03:18

+0

我想我做得正确,但我不知道为什么我没有得到期望的结果。 我真的很希望我在离开前24小时才离开它,现在重新开始我的任务,尽管调试旧的更糟! – 2012-02-05 20:16:04

我不相信这个类本身有什么问题,我发现当我运行游戏时,main()永远不会进入,所以这个类永远不会存在。这让我陷入了另一个困境,因为那是游戏场景的画面,看起来好像还好。

谢谢你的时间帮助我调试游戏类的代码都一样。