无法离开循环

时间:2014-05-31 00:52:01

标签: c++

在我正在编写的程序中,我输入一个循环并保持在那里直到在IF语句中找到我输入的匹配条目,或者如果找不到匹配则给出消息并继续尝试。

我也在尝试不同的课堂互动方式;在这种情况下,我让一个类成为另一个类的朋友,以便友元类可以访问和更改它与朋友成为的类中的变量。要访问此变量,我使用指向该类的指针。

我正在访问的变量用于控制检查用户输入条目的循环语句。

意图是只要它保持错误,它就会继续检查。

但是,当我运行程序并输入匹配的条目(在这种情况下只有一个)时,对应于匹配的IF语句会在显示预期的消息时执行,我对控制循环的变量的检查表明它按预期更改为TRUE(或者我假设,因为输出到控制台的插入代码行显示它已更改)。

然而循环继续并要求另一个输入,好像变量保持FALSE并且从未改变过。

另一个有趣的事情是,如果我从不输入匹配的条目,只是一些随机字母,第二个IF语句永远不会被执行(这应该是因为变量设置为FALSE),我知道这是因为相应的文本输出永远不会进入屏幕。

我曾经多次使用while循环语句作为这个,但从未有过这种不寻常的行为。

我怀疑它与我如何将这个类设置为朋友和/或我使用指针的方式有关。我没有多少经验,这就是为什么我认为问题所在,但我似乎无法弄清楚原因。

感谢任何帮助。

我尝试将原始代码缩小到尽可能小以反映相同的问题。

#include <iostream>
#include <fstream>
#include <sstream>
#include <iomanip>
#include <fstream>
#include <string>
#include <vector>
#include <iterator>
#include <sys/stat.h>
#include <windows.h>
#include <stdio.h>

class CAKE_REQUEST 
{
private:
        bool         match_found;
        friend class CAKE_LIST;
public:
        CAKE_REQUEST(){};
        void f_run_class();
        void f_run_user_input();
};

//***********************************************************

class CAKE_LIST 
{
private:
        CAKE_REQUEST *c_parent;
public:
        CAKE_LIST()
        {}

        void f_check_list(std::string imported_string)
        {
        std::string requested_desert;
        requested_desert = imported_string;

        if(requested_desert == "Cake")
            {
            c_parent->match_found = true;
            std::cout << "Cake was found, so eat it" << std::endl;
            std::cout << std::endl;
            }
            // This next if statement never seems to get executed
            // ( output of "No cake was found..." is not done)
            // when program is run even though non matching entries
            // are typed while in the loop
        if(c_parent->match_found == false)
           {
           std::cout << "No cake was found, so try baking one" << std::endl;
           std::cout << std::endl;
           }
        //checking "match_found" state of false or true
        std::cout << std::boolalpha << c_parent->match_found << std::endl; 
        }       
};

//************************************************************

int main()
{

std::cout << std::endl; 

CAKE_REQUEST my_request;

my_request.f_run_class();

std::cout << std::endl; 

return 0;
}

//***********************************************************

void CAKE_REQUEST::f_run_class()
{
f_run_user_input();
}

//***********************************************************

void CAKE_REQUEST::f_run_user_input()
{
HANDLE input_handle = GetStdHandle(STD_INPUT_HANDLE); 
INPUT_RECORD my_record; 
DWORD events;   
DWORD input_size;

std::string user_input;
CAKE_LIST the_list; 
match_found = false;

while(match_found == false )
  {
  std::cout << "Enter desert name: ";
  ReadConsoleInput( input_handle, &my_record, 1, &input_size);
  if(my_record.Event.KeyEvent.wVirtualKeyCode == VK_ESCAPE)
     {
     break; 
    }
  getline(std::cin, user_input);
  the_list.f_check_list(user_input);
  // next I was just trying to see if my typed input was as intended. Which it is.
  // I have also in other versions of this code output the state of "match_found" here
  // as I have above in the function f_check_list with the same results.
  // Although the variable match_found will show "true"
  // when I print it to screen as a check
  // The loop seems to be going by something else(always false); The loop never ends.
  std::cout << user_input << std::endl;   
  }
}  

0 个答案:

没有答案