0

In player.h I have enum race {Living, Dead, Nature,None};

In player.cpp I have

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

 }

So this should , when a player is created make myRace = None.

Now in Main.cpp I want to check a players race, how would i do this? I tried if (player[x].myRace=None) but of course that wont work..

4

4 回答 4

3

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

于 2013-06-24T07:07:54.150 回答
2

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

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

class Player {
...
public:
    Race getRace() const { return m_myRace; }
    ...
};
于 2013-06-24T07:41:53.610 回答
2

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

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

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

于 2013-06-24T07:19:25.630 回答
1

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

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

class Player{

    static int myRace;

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

然后,像这样访问它:

Player::GetMyRace();
于 2013-06-24T07:09:22.967 回答