C ++避免使用cout的换行符<<

时间:2014-12-10 14:35:29

标签: c++ io ostream

我怎样才能避免此代码中的换行符。

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;,但它既没有工作

3 个答案:

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

将该运算符设为friendoperator<<(std::ostream &, Foobar const&)不能inline的结果 - 能够在Foobar内执行。如果print-function不需要访问私有成员,请跳过friend

答案 2 :(得分:2)

endl移除BaseEl::display()或按@dasblinkenlight说:

void BaseEl::display() 
{
    cout << "P: " << priority << "\tN: " <<  name;
}