使用C ++什么可能是序列只运行一次的最佳方法?为了更清楚,例如我有一个程序,你需要猜一个字符串,如果用户输入提示我会显示单词的提示,但我只允许一次...我目前正在这样做:
bool hintLock = false;
...
if (guess == "hint"){
if (!hintLock){
cout << hint << endl;
hintLock = true;
}
else
cout << "I've given you the hint" << endl;
}
这是我的代码:
#include <iostream>
#include <string>
using namespace std;
void main(){
string guess;
bool hintLock = false;
cout << "Guess one of StackExchange's best site: Type \"hint\" for hint" << endl << endl;
do{
cout << "Guess > ";
cin >> guess;
if (guess == "hint"){ // Here it is
if (!hintLock){
cout << hint << endl;
hintLock = true;
}
else
cout << "I've given you the hint" << endl;
}
}
while (guess != "stackoverflow");
cout << "You've got it right!" << endl;
}
有没有更好的声明呢?或者它已经是最好的了?
答案 0 :(得分:3)
我怀疑你要么已经过分析了事情,要么你还没有充分描述真正的问题。从您发布的代码中,我认为没有理由不将您想要执行的代码包装到函数中,然后只调用该函数一次。
void blahBlah()
{
// blah blah
}
int main()
{
if (userInput == "hint")
blahBlah();
}
也许你的意思是在你的程序中你有一个主循环,它在程序终止之前执行,并且在那个循环中你接受来自用户的输入。允许用户请求提示,但在程序运行期间只允许一次。第一次要求提示他们给他们一个,但后来他们没有。
我仍然相信简单比花哨更好(阅读:复杂)。为此,我首先在主循环之外设置bool
范围,每次他们寻求帮助时都要检查:
int main()
{
bool displayedHint = false;
// program's main loop
for (bool endProgram = false; !endProgram; )
{
std::string command = getUserInput();
if (command == "hint")
{
if (displayedHint)
{
cout << "I already gave you a hint!\n";
}
else
{
displayHint();
displayedHint = true;
}
}
}
}
答案 1 :(得分:1)
如果你想确保它只为程序的任何特定运行显示一次(任何更全局的东西都非常复杂并且特定于平台),你需要的只是一个全局布尔值来保护函数。例如:
bool shownHint = false;
void showHint() {
if (!shownHint) {
cout << "The hint is: ........" << endl;
shownHint = true;
} else {
cout << "Hint has already been shown, no cheating!" << endl;
}
每当您认为您可能想要显示提示时,请致电showHint()
并在适当时显示(或不显示)。
诀窍是确保变量是全局的(或类中的静态,看起来几乎相同),这样它就不会在循环期间或程序运行时重置。
如果需要在运行之间保持不变,可以写入文件,检查服务器,设置注册表项或任意数量的其他选项。
答案 2 :(得分:0)
您可以使用布尔值的flags
来表示系统中的状态。一旦状态被“定义”,您就可以查询状态并查找它是“已设置”还是“已清除”..
更准确
bool hasHinted = false; // unset or cleared( also definition of a state variable)
if(hasHinted == false){
//do something
hasHinted = true; // set
}else{
// do nothing
}
答案 3 :(得分:0)
我认为OP正在寻找一段类似于singleton init的代码。即:只创建一次单例,然后返回指针。
void Init() {
static bool isInitialized = false;
if (!isInitialized) {
isInitialized = true;
doRealInit();
}
}
与std::call_once
完成同样的评论建议:
std::once_flag flag;
void do_once() {
std::call_once(flag, [](){ std::cout << "Called once" << std::endl; });
}
在我看来,它不是更具可读性或更短。
答案 4 :(得分:0)
我认为最合适的迭代语句是do-while。它允许至少一次迭代
例如
do
{
std::cout << "Enter your word: ";
std::string answer;
std::cin >> answer;
// some other stuff
} while ( false );
或者
bool allow = true;
do
{
std::cout << "Enter your word: ";
std::string answer;
std::cin >> answer;
// some other stuff
} while ( allow = !allow );