std::cout我想扩展使用我自己的控制台/cout 包装类的用法。
理想情况下,我会有 2 个 ostream,一个用于常规打印,另一个用于附加新行。
std::ostream Write;
Write << "Hello, I am " << 99 << " years old.";
Run Code Online (Sandbox Code Playgroud)
印刷Hello, I am 99 years old.
std::ostream WriteLine;
WriteLine << "Hello, I am " << 99 << " years old.";
Run Code Online (Sandbox Code Playgroud)
打印Hello, I am 99 years old.\n(一个实际的新行,而不仅仅是转义)
然后,我想扩展它以具有错误流(例如Error和),该错误流在消息之前添加前缀并以不同的颜色打印。ErrorLine"ERROR: "
我知道我必须创建自己的流来添加此功能,并且我遵循C++ cout 并使用前缀作为前缀std::cout,这几乎是我想要的,但不完全是。我不知道如何在流的末尾添加新行,并且前缀不可靠,特别是当我要执行多个打印语句时。
我还应该提到我不想使用重载运算符来实现这种效果,因为我希望能够以菊花链方式连接事物。
什么不起作用
如果我WriteLine >> "First";这样做,WriteLine << "Second";我会得到奇怪的结果,例如SecondFirst\n或Second\nFirst。我理想的输出是First\nSecond\n. …
我有很多operator<<()函数都是从做类似的事情开始的,所以我想把它抽象出来。这是我正在尝试做的事情的最小可重复案例(消除了所有的复杂性)。请注意,它不会编译。如果它确实编译了,我希望程序自己在一行上打印数字 3。
/*
clang++ -std=c++14 -Wall -Wextra foo.cc -o foo
*/
#include <ostream>
#include <iostream>
using std::cout;
using std::endl;
using std::ostream;
ostream& BaseFunction(ostream& os, const int x) {
return os << x;
}
int main(int argc, char *argv[]) {
cout << BaseFunction(cout, 3) << endl;
}
Run Code Online (Sandbox Code Playgroud)
错误开始是这样的:
foo.cc:17:8: error: invalid operands to binary expression ('ostream' (aka 'basic_ostream<char>') and
'ostream')
cout << BaseFunction(cout, 3) << endl;
~~~~ ^ ~~~~~~~~~~~~~~~~~~~~~
Run Code Online (Sandbox Code Playgroud)
然后提供了很多“没有已知的从 ostream 到 T 的转换”的建议。
有人看到我做错了什么吗?
例如,如果我想要一个默认的输出版本<<和一个详细的版本。
myClass myObject(//Constructor parameters);
cout << myObject << "\n";
cout << myObject.detailed << "\n";
Run Code Online (Sandbox Code Playgroud)
我尝试在我的班级中制作一个修改器,但这似乎不起作用。
class myClass {
public:
friend std::ostream& operator<<(std::ostream& output, const myClass& myObject);
std::ostream& detailed(std::ostream& output);
}
Run Code Online (Sandbox Code Playgroud)
这给出了错误“必须调用对非静态成员函数的引用”。
所以我的代码有问题,我想重载运算符<<,所有功能都在抽象类Employee中,所以
friend std::ostream &operator<<(std::ostream &os, const Employee &employee) {
os<<employee.print();
return os;
}
Run Code Online (Sandbox Code Playgroud)
这是一个函数打印:
virtual const std::string& print() const {
return "description: "+this->description+ " id: "+ std::to_string(this->getID()); }
Run Code Online (Sandbox Code Playgroud)
描述和ID只是Employee类中的一个变量
而且它不起作用,并且出现异常E0317,我理解它就像打印返回的不是字符串一样。另外,如果我将返回类型更改为
std::basic_string<char, std::char_traits<char>, std::allocator<char>>
Run Code Online (Sandbox Code Playgroud)
它神奇地起作用,但是我不明白为什么我不能使用标准字符串。
有人可以解释std::ostream &out这个朋友重载运算符函数的目的吗?为什么不直接std::cout在函数内部使用?
friend std::ostream& operator<<(std::ostream& out, const Complex& c)
{
out << c.real;
out << "+i" << c.imag << endl;
return out;
}
Run Code Online (Sandbox Code Playgroud)
相反,像这样:
friend operator<<(const Complex& c)
{
std::cout << c.real;
std::cout << "+i" << c.imag << endl;
}
Run Code Online (Sandbox Code Playgroud)