gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 04:47:26 25 4
gpt4 key购买 nike

我定义了两个类:

#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 函数连接,我该如何修复它,以便获得第一个输出?任何更正和解释将不胜感激

P.S 我的构造函数:

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

最佳答案

And I expected output:

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

But Instead I got:

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

大写版本的第一个区别,neuwertig vs Neuwertig 是因为

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

第二个区别,一条输出线 vs 两条线,是因为输出运算符

    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 并且从未改变,因此条件永远不会为真,第一行也不会打印。

关于c++ - C++ 中的 cerr 和 cout 意外输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48989556/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com