2010-09-14 170 views
2

我想重载< <运营商在Line类,所以我可以使用COUT这样打印的对象:重载运算符<<在C++

cout << myLineObject << endl; 

,但是这是行不通的:

class Line{ 
public: 
    float m; 
    float b; 
    string operator << (Line &line){return ("y = " + line.m + "x + " + line.b);}; 
}; 

我得到:

Invalid operands of types 'const char [5]' and 'float' to binary 'operator+' 

我也试图与stringstream但我得到甚至米矿石错误。这样做的正确方法是什么?

感谢;)

回答

9

operator<<必须是非成员函数,因为流是左边的参数。在你的情况,因为数据成员是公开的,可以在类外实现:

std::ostream& operator<<(std::ostream& stream, const Line& line) 
{ 
    return stream << "y = " << line.m << " x = " << line.b; 
} 
3

Google搜索这一块,看起来很好: Overloading <<

基本上,超载< <运营商IO时,你的函数应该是这样的:

friend ostream& operator<<(ostream& output, const YourClassHere& p); 

通知,该运算符< <不是类成​​员,而是外部函数(如果需要它可以是朋友)。这样的函数应该使用输出来写入并返回它,这样就可以链接它。

+0

这是正确的声明,但是您没有解决函数体中的问题。 – 2010-09-14 13:50:19

+0

如何写身体在我给出的链接中描述。例如有关于Point类的例子,它几乎与问题(Line)完全相同。所以我想出了一个链接到材料而不是c&p的概念(或者那里描述的想法)。 – 2010-09-14 13:56:58

16

正确的方式被列出无处不在超载<<进行了讨论,你几乎已经错过了所有的。

标准声明是ostream & operator<<(ostream & s, const & Line l);它不能是一个成员函数,它需要返回一个对ostream的引用,这样才能像正常情况下链接<<

的定义,你的情况,会是这样

ostream & operator<<(ostream & s, const & Line l) 
{ 
    return s << "y = " << l.m << "x + " << l.b; 
} 

请注意,您返回传入ostream,并打印你喜欢用<<运营商,而不是使用+操作。这很简单,如果你按照这个 表格。

在这种情况下,数据成员是公开的(通常这不是一个好主意),因此不存在访问问题 。如果您需要获取无法访问的值(因为 它们是private而未公开在公开界面中),您需要在类定义中声明 运算符为friend

+0

'l'应该是'line'作为第二个参数(或者'line'应该是'l'在函数体中)。 – 2010-09-14 14:19:13

+0

@Steven:谢谢。我已编辑匹配。 – 2010-09-14 14:40:44

0

这里的错误是无关的操作符重载,但一旦解决,你可能有更多的问题。发生此错误是因为没有定义operator+,其参数为const char[5]float。由于您试图连接这四个参数的字符串形式,因此您必须以编译器可以理解的方式执行此操作,例如,

ostringstream concat; 
concat << string("y = ") << line.m << string("x + ") << line.b; 
return concat.str(); 

一旦你过去这一点,你可以在你的<<超载逻辑工作。

0

你可以这样说:

class Line{ 
    public: 
    float m; 
    float b; 
    friend ostream& operator<< (ostream& out, Line& object) { 
    out << object.m << endl; 
    out << object.b << endl; 
    return out; 
    } 
}; 

然后,你可以这样做: COUT < < your_Line_object < < ENDL;

0

其他已经说明了正确的方法。我想我会提到你做错了什么。

你定义一个操作,采用两个线对象:

Line a; 
Line b; 
string c = a << b; 
// c would have the string values for line b 
// the values of line a would be ignored. 

当然,这不是你所看到的错误。这是由行"y = " + line.m造成的。 “y =”是一个char [5]。 amd line.m是一个浮点数,并且没有运算符+它将这两个(这不是基本 - 或C#)。

问题是,C++没有简单的方法将非字符串值“添加”到字符串中。这就是为什么我们使用cout <<的惯例。