C++ 当在循环之外时是否可能中断循环?

C++ 当在循环之外时是否可能中断循环?,c++,C++,在尝试进行while(bool)循环后,由于向量中没有任何内容而无法看到向量的内容,因此失败了,我进行了while(true)循环,目的是在用户输入0时中断。下面是代码的重要部分 编辑:工作代码,但|=意味着什么 #include "std_lib_facilities.h" class Name_pairs { public: vector<string>names; vector<double>ages; bool test

在尝试进行while(bool)循环后,由于向量中没有任何内容而无法看到向量的内容,因此失败了,我进行了while(true)循环,目的是在用户输入0时中断。下面是代码的重要部分

编辑:工作代码,但|=意味着什么

#include "std_lib_facilities.h"

class Name_pairs
{
public:
       vector<string>names;
       vector<double>ages;
       bool test();
       string read_names();
       double read_ages();
       void print();
};

string Name_pairs::read_names()
{
       string name;
     cout << "Enter name: ";
     cin >> name;
     names.push_back(name);
     return name;
}

double Name_pairs::read_ages()
{
     double age;
     cout << "Enter corresponding age: ";
     cin >> age;
     ages.push_back(age);
     cout << endl;
     return age;
}

void Name_pairs::print()
{
     for(int i = 0; i < (names.size()-1) && i < (ages.size()-1); ++i)
             cout << names[i] << " , " << ages[i] << endl;
}

bool Name_pairs::test()
{
   if(ages.empty() || names.empty()) return true;
   if(ages.back() = 0 || names.back() == "0"){
                          return false;}
   return true;
}


int main()
{
    Name_pairs np;
    cout << "Enter names and ages. Use 0 to cancel.\n";
    bool finished = false;
    while(!finished){
    finished |= "0" == np.read_names();
    finished |= 0 == np.read_ages();}        
    np.print();
    keep_window_open();
}
#包括“std_lib_facilities.h”
类名\u对
{
公众:
矢量名称;
矢量;
布尔检验();
字符串read_names();
双读本();
作废打印();
};
字符串名称\u对::读取\u名称()
{
字符串名;
姓名;
名称。推回(名称);
返回名称;
}
双名双对::read_ages()
{
双倍年龄;
年龄;
年龄。推回(年龄);

cout您可以简单地使每个函数返回bool,然后在循环中检查函数是否返回false。如果是,则中断

你也可以从函数内部抛出一个错误,从外部捕获并适当地处理它,但我认为这有点极端。我得到的印象是,你只是在寻找一个“退出代码”类型的东西。如果是这样的话,我建议你只需返回一个bool并检查是否应该跳出循环

编辑:所以您的更新代码似乎有点复杂,但这就是我返回bool的意思:

void Name_pairs::read_names()
{
    cout << "Enter name: ";
    cin >> name;
    names.push_back(name);
}

bool Name_pairs::read_ages()
{
    cout << "Enter corresponding age: ";
    cin >> age;

    if ( age == 0 )
        return false;
    ages.push_back(age);
    cout << endl;
    return true;
}

// Now we can test if its time to break.
while ( true )
{
    np.read_names();
    if ( !np.read_ages() )
        break;
}
void Name_pairs::read_names()
{
姓名;
名称。推回(名称);
}
bool Name_pairs::read_ages()
{
年龄;
如果(年龄==0)
返回false;
年龄。推回(年龄);

cout您可以简单地使每个函数返回bool,然后在循环中检查函数是否返回false。如果是,则中断

你也可以从函数内部抛出一个错误,从外部捕获并适当地处理它,但我认为这有点极端。我得到的印象是,你只是在寻找一个“退出代码”类型的东西。如果是这样的话,我建议你只需返回一个bool并检查是否应该跳出循环

编辑:所以您的更新代码似乎有点复杂,但这就是我返回bool的意思:

void Name_pairs::read_names()
{
    cout << "Enter name: ";
    cin >> name;
    names.push_back(name);
}

bool Name_pairs::read_ages()
{
    cout << "Enter corresponding age: ";
    cin >> age;

    if ( age == 0 )
        return false;
    ages.push_back(age);
    cout << endl;
    return true;
}

// Now we can test if its time to break.
while ( true )
{
    np.read_names();
    if ( !np.read_ages() )
        break;
}
void Name_pairs::read_names()
{
姓名;
名称。推回(名称);
}
bool Name_pairs::read_ages()
{
年龄;
如果(年龄==0)
返回false;
年龄。推回(年龄);

cout您可以让函数返回一个值,然后检查该值,必要时中断

您也可以在调用函数后检查已读入的值。在这种情况下,如果(names.back()=“something”)或(ages.back()=“0”)可以工作,则类似于这样做

编辑:

您的总体想法是好的(在循环的每次迭代中运行test(),如果满足退出条件,则返回false),但是有几个实现错误:

   if(ages[bool_counter] = 0 || names[bool_counter] == "0")
对于第一个条件,您需要“==”而不是“=”。我打赌您的编译器警告过您这一点,您通常应该听他的警告:)。您当前的语句正在将0分配给年龄[0],而没有检查它是否为0

您还应该在尝试取消引用第一个元素之前检查大小,否则,正如您所指出的,如果年龄或名称为空,则会出现错误

所以把它改成

 if( (ages.size() > 0 ) && (ages.back() == 0)) ||
     (names.size() > 0) && (names.back() == "0"))

应该可以工作,不过为了清晰起见,我更喜欢deus的响应。

您可以让函数返回一个值,然后检查该值,必要时中断

您也可以在调用函数后检查已读入的值。在这种情况下,如果(names.back()=“something”)或(ages.back()=“0”)可以工作,则类似于这样做

编辑:

您的总体想法是好的(在循环的每次迭代中运行test(),如果满足退出条件,则返回false),但是有几个实现错误:

   if(ages[bool_counter] = 0 || names[bool_counter] == "0")
对于第一个条件,您需要“==”而不是“=”。我打赌您的编译器警告过您这一点,您通常应该听他的警告:)。您当前的语句正在将0分配给年龄[0],而没有检查它是否为0

您还应该在尝试取消引用第一个元素之前检查大小,否则,正如您所指出的,如果年龄或名称为空,则会出现错误

所以把它改成

 if( (ages.size() > 0 ) && (ages.back() == 0)) ||
     (names.size() > 0) && (names.back() == "0"))

应该行得通,不过为了清楚起见,我更喜欢deus的回答。

如果
年龄
/
姓名
为空,您可以显式地签入
测试()
,并且只有当姓名不为空时才进行“真实”检查:

bool Name_pairs::test() {
    if (ages.empty() || names.empty())
      return true;
    return (ages.back() != 0) && (names.back() != "0");
}

如果
年龄
/
名称
为空,则可以显式签入
test()
,并且只有在名称不为空时才执行“真实”检查:

bool Name_pairs::test() {
    if (ages.empty() || names.empty())
      return true;
    return (ages.back() != 0) && (names.back() != "0");
}

如果你改变问题,把它颠倒过来看,它就会变得非常简单

更改setter方法以实际返回刚输入的值。我还将age设置为该方法的局部变量,以防止副作用蔓延:

Double Name_pairs::read_ages()
{
     Double age;
     cout << "Enter corresponding age: ";
     cin >> age;
     ages.push_back(age);
     cout << endl;
     return age;
}
由于您在main中设置退出条件(键入0以退出),因此最好在那里测试退出条件的一致性

这就是我的看法……代码更短,更容易理解



编辑我将代码更改为反映注释aem。通过这种方式使用正确的逻辑运算符。对于级联计算,如果第一个答案为0,则第二个问题甚至不会被问(完成后计算为true,因此or语句的其余部分将不会被计算)因此,你必须注意这一点(例如,如果你希望两个向量始终具有相同的长度)。然而,我发现可用性是明智的,因为用户已经表示他想退出,所以我认为问他其他问题没有用。

如果你改变问题并将其颠倒过来看,问题就变得非常简单

更改setter方法以实际返回刚输入的值。我还将age设置为该方法的局部变量,以防止副作用蔓延:

Double Name_pairs::read_ages()
{
     Double age;
     cout << "Enter corresponding age: ";
     cin >> age;
     ages.push_back(age);
     cout << endl;
     return age;
}
因为你正在设定你的目标