C++类枚举成员变量

C++ Class Enumeration Member variable

本文关键字:变量 枚举成员 C++      更新时间:2023-10-16

我有一个枚举类型为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中的断点都被击中了。

故事的寓意:先试试显而易见的。