我有一个Player类,其中Class类型的每个对象都有一个名称,wins,loss和draw。通过调用the_player = new Player(the_name)创建Player类的每个对象。当用户输入新名称以将Player对象添加到程序时,指针被推入向量AllPlayers。程序应该在按下新指针之前检查所述向量中尚未存在所需的播放器。我必须在整个程序中多次检查,所以我想我会为它编写一个函数。这是我的功能:
int findPlayer(vector<Player*> &vals, string name_in)
{
for (int i = 0; i < vals.size(); i++){
if (vals[i]->getName() == name_in){
cout << vals[i]->toString() << endl;
return i;
}
else
return -1;
}
};
当请求选项添加新播放器时,使用以下代码:
do {
cout << "Name: ";
cin >> the_name;
if (findPlayer(AllPlayers, the_name) != -1){
cerr << "Player already exists\n";
}
} while (findPlayer(AllPlayers, the_name) != -1);
the_player = new Player(the_name);
AllPlayers.push_back(the_player);
出于某种原因,但是,每当我尝试添加一个新玩家时,它都会抛出“玩家已经存在”并且永远不会离开do-while循环。当AllPlayers向量为空时,这甚至是正确的。我添加了一个cout&lt;&lt; findPlayer(AllPlayers,the_name)用于调试,它打印4192252,我假设它是矢量中可能的最大元素。
所以问题是:为什么它返回4192252而不是-1?
答案 0 :(得分:4)
如果vals
为空,则永远不会输入for循环,并且函数退出时不会返回return语句。这意味着你得到一个随机值,在这种情况下,4192252
碰巧在返回寄存器中。如果您阅读它们,您的编译器警告会告诉您。
答案 1 :(得分:3)
您认为,如果vals为空,将从findPlayer返回什么?
是否定义了?
答案 2 :(得分:1)
如果向量为空,则根本不进入循环,因此不要达到return
语句并且不返回有效值。您应该启用编译器警告以捕获此错误。
否则,您只检查第一项,并立即返回是否匹配。如果找到匹配项,您想要返回,但是如果没有匹配则只返回-1:
for (int i = 0; i < vals.size(); i++){
if (vals[i]->getName() == name_in){
cout << vals[i]->toString() << endl;
return i;
}
}
return -1;
答案 3 :(得分:0)
查找播放器功能应该是:
int findPlayer(vector<Player*> &vals, string name_in)
{
if(vals.size() == 0)
return -1;
for (int i = 0; i < vals.size(); i++){
if (vals[i]->getName() == name_in){
cout << vals[i]->toString() << endl;
return i;
}
}
return -1;
};
答案 4 :(得分:0)
按以下方式重写该功能
bool findPlayer( const std::vector<Player*> &vals, const std::string &name_in )
{
std::vector<Player*>::size_tyoe i = 0;
while ( i < vals.size() && vals[i]->getName() != name_in ) ++i;
return i != vals.size();
}
考虑到必须使用限定符getName
定义成员函数const
。
至于你的函数,那么当向量为空时它不返回任何内容,或者当向量的第一个元素与字符串不一致时返回-1。
考虑到标题std::find_if
中声明的标准算法<algorithm>
可用于代替您的函数。