[英]C++ avoiding newline with cout <<
如何避免在此代码中使用换行符。
void ListEl::display() {
BaseEl::display();
cout << " Asis: " << anemnesis << endl;
}
这是BaseEl :: display()
void BaseEl::display() {
cout << "P: " << priority << "\tN: " << name << endl;
}
它总是打印BaseEl::display();
的输出BaseEl::display();
然后是换行符,然后是" Asis: " << anemnesis << endl;
我尝试了cout << BaseEl::display() << " Asis: " << anemnesis << endl;
但它也不起作用
您必须修改BaseEl::display()
才能在输出末尾停止产生新行,才能解决此问题。
通常,将endl
添加到您自己的输出中是个坏主意。 如果呼叫者需要换行符,则让呼叫者这样做。
请注意,一种更类似于C ++的方法来输出您自己的类是为输出提供operator <<
的实现。 如果要使用它进行虚拟调度,请在基类级别提供一个实现,然后为派生类添加一个虚拟成员函数以覆盖:
class BaseEl {
protected:
virtual void writeToStream(ostream& ostr) const;
friend ostream& operator << (ostream& ostr, const BaseEl& val);
};
class ListEl : public BaseEl {
protected:
virtual void writeToStream(ostream& ostr) const;
};
ostream& operator << (ostream& ostr, const BaseEl& val) {
val.writeToStream(ostr);
return ostr;
}
endl
的意思是打印换行符并刷新输出缓冲区。 因此,您需要将其从不需要换行符的位置删除。
过度刷新输出缓冲区可能会导致性能损失,通常不需要手动执行,因此通常应避免使用endl
(除非如此,除非您明确要换行并刷新)。
简而言之,作为一般规则:
std::flush
'\\n'
或将其附加到字符串: "foobar!\\n"
std::endl
在C ++中,对象序列化是通过重载operator<<
和operator>>
,因此您可以编写
ListEl mylist;
std::cout << "The list: " << mylist << '\n';
规范地说,对于输出,它看起来像这样:
class Foobar {
friend std::ostream& operator<< (std::ostream& os, Foobar const &);
};
// might go into implementation file
std::ostream& operator<< (std::ostream& os, Foobar const &foobar) {
// print work
....
// Do not forget to return the stream
return os;
}
让该操作符成为friend
是operator<<(std::ostream &, Foobar const&)
在Foobar
不能inline
结果。 如果打印功能不需要访问私人成员,请跳过friend
。
从BaseEl::display()
删除endl
或按照@dasblinkenlight的说明进行操作:
void BaseEl::display()
{
cout << "P: " << priority << "\tN: " << name;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.