让Enum工作

时间:2013-06-24 07:01:28

标签: c++

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);

 }

所以这应该是,当创建一个玩家时,make myRace = None。

现在在Main.cpp我想检查一场球员比赛,我该怎么做? 我试过if (player[x].myRace=None),但当然不会工作..

4 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

枚举的全部意义在于消除魔法数字,因此虽然枚举可以转换为整数,但从整数中获取枚举会产生反作用。 您应该写myRace=None,而不是myRace=4

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

第三,在C ++中,您不必编写this-&gt; 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是作为成员变量并且你的函数是同一个类的方法时,函数才能访问它。

答案 2 :(得分:2)

枚举应该按照你描述的方式工作。不幸的是,您只提供了修改的,不可运行的代码,没有编译器错误或其他输出。但是,以下代码应显示如何使用枚举:(Live demo

#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)。 (Live demo

#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] .race = None”将不起作用,因为这是赋值,而不是对相等性的测试。你没有说它为什么不起作用,我将假设 - 如果它不仅仅是错误的变量名称 - 因为它是私有的或无法访问的。在这种情况下,只需添加一个成员函数即可返回竞赛:

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

答案 3 :(得分:1)

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

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

class Player{

    static int myRace;

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

然后,像这样访问它:

Player::GetMyRace();