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