0

使用 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;
    }

有没有更好的声明来做到这一点?还是已经是最好的了?

4

5 回答 5

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;
      } 
    } 
  }
}
于 2013-11-08T14:38:01.463 回答
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(),它会根据需要显示(或不显示)。

诀窍是确保变量是全局变量(或类中的静态变量,看起来几乎相同),以便在循环期间或程序运行时不会重置它。

如果您需要在运行之间持久化,您可以写入文件、检查服务器、设置注册表项或任何数量的其他选项。

于 2013-11-08T14:42:55.153 回答
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
}
于 2013-11-08T14:38:37.623 回答
0

我认为 OP 正在寻找一段类似于单例初始化的代码。即:只创建一次单例,之后总是返回指针。

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; });
}

在我看来,它并没有真正更具可读性或更短。

于 2013-11-08T14:42:57.067 回答
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 );
于 2013-11-08T14:49:27.753 回答