我如何使用cout << myclass


82

myclass 是我写的C ++类,当我写的时候:

myclass x;
cout << x;

如何输出1020.2,如integerfloat值?

Answers:


100

通常通过operator<<为您的课程重载:

struct myclass { 
    int i;
};

std::ostream &operator<<(std::ostream &os, myclass const &m) { 
    return os << m.i;
}

int main() { 
    myclass x(10);

    std::cout << x;
    return 0;
}

9
请注意,如果myclass有任何private字段,并且要operator<<()输出它们,myclass则应声明std::ostream& operator<<(std::ostream&, myclass const&)为好友。
贾斯汀时间-恢复莫妮卡

3
这不应该const myclass &m代替myclass const &m吗?
Nubcake

3
@Nubcake:否。就编译器而言,两者的含义相同,但是我仍然认为前缀格式错误。要读取C ++声明,请从声明的内容开始,然后向外进行操作,并const在类型之后加上:m is a reference to a const myclass。有了它的类型之前,它说:“米是一个MyClass的const`,这是正确的意义和真正不通的不规则的边缘提供参考。
杰里棺材

1
对于像我这样困惑的任何人,请将运算符重载放在类定义之外(就像示例中一样)。
umnikos '19

1
@Lorenzo:不,它不能是成员函数。有关更多详细信息,请参见stackoverflow.com/a/9814453/179910
杰里·科芬

22

您需要重载<<运算符,

std::ostream& operator<<(std::ostream& os, const myclass& obj)
{
      os << obj.somevalue;
      return os;
}

然后,当您执行此操作时cout << x(在您的情况下x为type myclass),它将输出您在方法中告诉您的内容。在上面的示例中,它将是x.somevalue成员。

如果不能将成员的类型直接添加到中ostream,则您需要<<使用与上述相同的方法来重载该类型的运算符。


4
那是左移运算符,而不是“流运算符”。在Iostream的上下文中,它是插入或提取运算符,但它永远不是流运算符。
Billy ONeal 2010年

1
抱歉,是的,您是对的。这就是我脑海中所说的,因为我倾向于仅在处理流时才使用它。在这种情况下,它将是您所说的插入运算符,而不仅仅是流运算符。我已更新我的答案以删除该位。
Rich Adams 2010年

14

这很简单,只需实现:

std::ostream & operator<<(std::ostream & os, const myclass & foo)
{
   os << foo.var;
   return os;
}

您需要返回对os的引用才能链接输出(cout << foo << 42 << endl)


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.