使枚举工作

Making Enum work

本文关键字:工作 枚举      更新时间:2023-10-16

player.h中,我有enum race {Living, Dead, Nature,None};

player.cpp中,我有

race myRace;
    void Player::addPlayer(int x)
 {
    cout<<"added player"<<x<<endl;
    this->karma=0;
    this->myTurn=false;
    myRace=race(4);
 }

因此,当一个玩家被创建时,这应该使myRace=None。

现在在Main.cpp中,我想查看一个玩家比赛,我该怎么做?我试过if (player[x].myRace=None),但当然不行。。

这应该有效:myRace = None;是使用枚举以避免您犯下的另一个错误的推荐方法,4不是枚举的有效整数选项,因为Living是0,None将是3。

枚举应该按照您描述的方式工作。不幸的是,您只提供了修改过的、不可运行的代码,没有编译器错误或其他输出。但是,下面的代码应该向您展示如何使用枚举:(实时演示)

#include <iostream>
enum Race { None, Living, Dead, Nature}; // always put invalid as the 0 entry.
class Player
{
      uint32_t m_karma;
      bool     m_myTurn;
      Race     m_myRace;
public:
    void addPlayer(int x_)
    {
        std::cout << "added player " << x_ << std::endl;
        m_karma = 0;
        m_myTurn = false;
        m_myRace = None;
    }
};
int main(int argc, const char** argv)
{
    Player fred;
    fred.addPlayer(1);
    return 0;
}

如果你有一个支持C++11的编译器,你可以更具体地使用"枚举类",这将迫使你限定枚举(即Race::None)。(现场演示)

#include <iostream>
enum class Race { None, Living, Dead, Nature}; // always but invalid as the 0 entry.
class Player
{
      uint32_t m_karma;
      bool     m_myTurn;
      Race     m_myRace;
public:
    void addPlayer(int x_)
    {
        std::cout << "added player " << x_ << std::endl;
        m_karma = 0;
        m_myTurn = false;
        m_myRace = Race::None;
    }
};
int main(int argc, const char** argv)
{
    Player fred;
    fred.addPlayer(1);
    return 0;
}

"player[x].rese=None"不起作用,因为这是分配,而不是对平等的测试。你没有说为什么它不起作用,我假设——如果它不仅仅是错误的变量名——因为它是私有的或不可访问的。在这种情况下,只需添加一个成员函数即可返回比赛:

class Player {
...
public:
    Race getRace() const { return m_myRace; }
    ...
};

枚举的全部目的是消除神奇的数字,因此尽管枚举可以转换为整数,但从整数中获取枚举会适得其反。您应该编写myRace=None,而不是myRace=4

其次,除非您在枚举类型的声明中明确指定其他方式,否则枚举从0开始,因此None对应于3而不是4。

第三,在C++中,您不必编写这个->member_name来访问成员变量。如果您想区分成员和非成员,可以通过采用更短的命名约定来节省许多键击。(例如在成员变量名后面附加_)。

最后,C++中的=表示赋值,而不是相等比较if (player[x].myRace=None)实际上意味着player[x].myRace=None; if (player[x].myRace),即条件始终为真,因为player[x].myRace=None==3。大多数情况下,if条件中的赋值运算符是一个错误,编译器可能会对此发出警告。

此外,成员变量访问myRace全局变量有点奇怪(全局变量通常是个坏主意)。如果myRace不是全局的,那么只有当指针或引用作为参数传递给函数,或者myRace作为成员变量并且函数是同一类的方法时,函数才能访问它。

这里要小心!myRace不是Player类的一部分。因此,无论玩家数量如何,您都将拥有myRace的一个实例。你应该让myRace成为你班的一部分。如果你不这样做,每次你创造一个新玩家,种族都会改变!

如果这是你想要的,它应该是你播放器类的静态成员,所以你可以添加一个静态getter来检索

class Player{
    static int myRace;
public:
    static int GetMyRace(){
        return myRace;
    }
    ...
}

然后,像这样访问它:

Player::GetMyRace();