在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)
,但当然不会工作..
答案 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();