在我正在编写的程序中,我输入一个循环并保持在那里直到在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;
}
}