我试图用C ++开发BattleShip游戏,我差不多完成了。为此,我需要我的gameOver
功能。所有的船都沉没了,我的游戏结束了。因此,我试图计算我的字符串状态(来自Ship)中有多少个小写字符。当一半的字符是小写字母时," ship"被销毁,我已准备好使用我的gameOver
功能。
但不知怎的,我的count_if
无法正常工作,我也不知道为什么。
你走了:
#include <algorithm>
bool Ship::isDestroyed() const{
//This counts those chars that satisfy islower:
int lowercase = count_if (status.begin(), status.end(), islower);
return ( lowercase <= (status.length/2) ) ? true : false;
}
bool Board::gameOver() {
bool is_the_game_over = true;
for(int i = 0 ; i < ships.size() ; i++){
if( ships[i].isDestroyed() == false ) {
//There is at least one ship that is not destroyed.
is_the_game_over = false ;
break;
}
}
return is_the_game_over;
}
我做错了什么?
答案 0 :(得分:10)
不幸的是,标准库有多个islower
的重载(来自C库的函数,以及来自本地化库的函数模板),所以你不能简单地命名函数,除非你& #39;重新打电话。
您可以将其转换为正确的函数类型:
static_cast<int (*)(int)>(islower)
或希望您的实现将C库转储到全局命名空间以及std
:
::islower // not guaranteed to work
或将其包裹在lambda中
[](int c){return islower(c);}
答案 1 :(得分:3)
尝试按以下方式更改算法调用
int lowercase = count_if (status.begin(), status.end(), ::islower);
^^^
允许编译器将标准C函数放在全局命名空间中。
否则使用lambda表达式,例如
int lowercase = count_if (status.begin(), status.end(),
[]( char c ) return islower( c ); } );