我怎样才能避免此代码中的换行符。
void ListEl::display() {
BaseEl::display();
cout << " Asis: " << anemnesis << endl;
}
这里是BaseEl :: display()
void BaseEl::display() {
cout << "P: " << priority << "\tN: " << name << endl;
}
它始终打印BaseEl::display();
的输出,然后输出换行符,然后打印" Asis: " << anemnesis << endl;
我尝试了cout << BaseEl::display() << " Asis: " << anemnesis << endl;
,但它既没有工作
答案 0 :(得分:8)
如果不修改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;
}
答案 1 :(得分:3)
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&)
不能inline
的结果 - 能够在Foobar
内执行。如果print-function不需要访问私有成员,请跳过friend
。
答案 2 :(得分:2)
从endl
移除BaseEl::display()
或按@dasblinkenlight说:
void BaseEl::display()
{
cout << "P: " << priority << "\tN: " << name;
}