c ++中的cerr和cout意外输出

用户8929476

我定义了两个类:

#include <iostream>
#include <vector>
#include <string>
#include <stdexcept>
#include <algorithm>
#include <cmath>
#include <list>
using namespace std;


vector<string> zustand_namen = {"Neuwertig","Gut", "Abgegriffen","Unbrauchbar"};

enum class Zustand{Neuwertig,Gut, Abgegriffen,Unbrauchbar};

class Exemplar{
private:
    int num;
    Zustand zust;
    bool verliehen;
public:
    Exemplar(int num,Zustand zust);
    Exemplar(int num);
    bool verfuegbar() const;
    bool entleihen();
    void retournieren(Zustand z);
    friend ostream& operator<<(ostream& os, const Exemplar& ex);
};


class Werk{
private:
    string autor;
    string name;
    int jahr;
    vector<Exemplar> vec;
public:
    Werk(string autor,string name,int jahr);
    void erwerben(int nr, Zustand z);
    bool entleihen();
    void retournieren(int index, Zustand z);
    friend ostream& operator<<(ostream& os, const Werk& werk);

};

比我在主程序中测试我的结果:

int main() {
  try {
    Exemplar e{0, Zustand::Unbrauchbar};
    cout << e << '\n';
  }
  catch (runtime_error&) {
    cout << "Error1\n";
  }
  try {
    Exemplar e{1};
    cout << e << '\n';
    cerr << e << '\n';
  }
  catch (runtime_error&) {
    cout << "Error2\n";
  }
  try {
    Exemplar e{1001};
    cout << e << '\n';
  }
  catch (runtime_error&) {
    cout<<"Error3\n";
  }



  return 0;
}

我期望输出:

Error1
[Auflage: 1, Zustand: neuwertig]
[Auflage: 1, Zustand: neuwertig]
Error3
[Auflage: 2, Zustand: gut]
[Auflage: 2, Zustand: gut]

但我得到了:

Error1
[Auflage:1, Zustand:Neuwertig]
Error3
[Auflage:1, Zustand:Neuwertig]

为什么会这样?这个输出的原因是什么(我想它应该与 cerr 函数连接,我该如何修复它,以便获得第一个输出?任何更正和解释将不胜感激

PS我的构造函数:

Werk::Werk(string autor,string name,int jahr):
    autor{autor},
    name{name},
    jahr{jahr}
    {
        if(autor.size()<1) throw runtime_error("autor is incorrect");
        if(name.size()<1) throw runtime_error("name is incorrect");
        if(jahr<1700 ||jahr >2017) throw runtime_error("jahr is incorrect");
    }


Exemplar::Exemplar(int num,Zustand zust):
    num{num},
    zust{zust},
    verliehen{false}
    {
        if(num <1 || num >1000) throw runtime_error("num is incorrect");
    }



Exemplar::Exemplar(int num):
    num{num},
    zust{Zustand::Neuwertig},
    verliehen{false}
    {
        if(num <1 || num >1000) throw runtime_error("num is incorrect");
    }

输出运算符:

ostream& operator<<(ostream& os, const Exemplar& ex){
    if(ex.verliehen == true){
        os << "[" << "Auflage:" << ex.num <<", " << "Zustand:" << zustand_namen[static_cast<int>(ex.zust)] <<", " << "verliehen"<<"]";
    }
        os << "[" << "Auflage:" << ex.num <<", " << "Zustand:" << zustand_namen[static_cast<int>(ex.zust)] << "]";
    return os;
}

ostream& operator<<(ostream& os, const Werk& werk){
    os << "[" << werk.autor << ", " << werk.name << ", " << werk.jahr << "{";
    for(int i = 0; i<werk.vec.size();++i){
        if(i < werk.vec.size()-1){
            os << werk.vec[i] << ", ";
        } else{
            os << werk.vec[i];
        }

    }
    return os;
}
奥拉夫·迪切

我期望输出:

Error1
[Auflage: 1, Zustand: neuwertig]
[Auflage: 1, Zustand: neuwertig]
Error3
[Auflage: 2, Zustand: gut]
[Auflage: 2, Zustand: gut]

但我得到了:

Error1
[Auflage:1, Zustand:Neuwertig]
Error3
[Auflage:1, Zustand:Neuwertig]

首差大写版本,neuwertigvsNeuwertig是因为

vector<string> zustand_namen = {"Neuwertig","Gut", "Abgegriffen","Unbrauchbar"};

第二个区别,一条输出线与两条线,是因为输出操作符

    if (ex.verliehen == true) {
        os << "[" << "Auflage:" << ex.num <<", " << "Zustand:" << zustand_namen[static_cast<int>(ex.zust)] <<", " << "verliehen"<<"]";
    }

    os << "[" << "Auflage:" << ex.num <<", " << "Zustand:" << zustand_namen[static_cast<int>(ex.zust)] << "]";

当成员verliehen设置为 true 时,将打印两行。如果成员为假,则只打印一行。该成员在构造函数中verliehen被初始化false并且永远不会改变,所以条件永远不会为真,第一行永远不会打印。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在c ++中'cout << cout'和'cout <<&cout'之间的区别?

来自分类Dev

在Ubuntu中将C ++生成的cerr和cout重定向到同一文件

来自分类Dev

C中回文函数的意外输出

来自分类Dev

带联合的C代码中的意外输出

来自分类Dev

C ++中的cout vs printf提供不同的输出

来自分类Dev

c++ 中 cout.precision() 的奇怪输出

来自分类Dev

C ++意外数字输出

来自分类Dev

C的意外输出

来自分类Dev

C ++程序的意外输出

来自分类Dev

C代码意外输出

来自分类Dev

在C ++中使用scanf()和printf()的意外输出

来自分类Dev

涉及getchar()和putchar()的C简单代码意外输出

来自分类Dev

在C ++中使用scanf()和printf()的意外输出

来自分类Dev

尝试使用指针和 malloc 构建堆栈。意外输出 C

来自分类Dev

C中的指针数组排序具有意外的输出

来自分类Dev

C中字符串的printf的意外输出

来自分类Dev

在我的 C 代码中需要帮助 - 获得意外输出

来自分类Dev

C ++中多线程时与cout和printf的区别

来自分类Dev

C ++中的多个输入和输出

来自分类Dev

C中的FILE和不同的输出

来自分类Dev

从C中的文件读取和输出整数

来自分类Dev

测试程序的意外输出,其中包含C语言中的指针和间接级别

来自分类Dev

C ++中的std :: variant cout

来自分类Dev

C和C ++中const变量的不同输出

来自分类Dev

C#模板和意外/意外推断

来自分类Dev

C++:bool 方法在 cout 语句后返回意外数字

来自分类Dev

C ++代码在不同的编译器中显示不同的输出,这是意外的

来自分类Dev

使用RDTSC访问内存中的ARRAY的C语言中的意外输出

来自分类Dev

C ++-来自std :: string的意外输出