重载运算符<<在C++
我想重载< <运营商在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
但我得到甚至米矿石错误。这样做的正确方法是什么?
感谢;)
operator<<
必须是非成员函数,因为流是左边的参数。在你的情况,因为数据成员是公开的,可以在类外实现:
std::ostream& operator<<(std::ostream& stream, const Line& line)
{
return stream << "y = " << line.m << " x = " << line.b;
}
Google搜索这一块,看起来很好: Overloading <<
基本上,超载< <运营商IO时,你的函数应该是这样的:
friend ostream& operator<<(ostream& output, const YourClassHere& p);
通知,该运算符< <不是类成员,而是外部函数(如果需要它可以是朋友)。这样的函数应该使用输出来写入并返回它,这样就可以链接它。
正确的方式被列出无处不在超载<<
进行了讨论,你几乎已经错过了所有的。
标准声明是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
。
'l'应该是'line'作为第二个参数(或者'line'应该是'l'在函数体中)。 – 2010-09-14 14:19:13
@Steven:谢谢。我已编辑匹配。 – 2010-09-14 14:40:44
这里的错误是无关的操作符重载,但一旦解决,你可能有更多的问题。发生此错误是因为没有定义operator+
,其参数为const char[5]
和float
。由于您试图连接这四个参数的字符串形式,因此您必须以编译器可以理解的方式执行此操作,例如,
ostringstream concat;
concat << string("y = ") << line.m << string("x + ") << line.b;
return concat.str();
一旦你过去这一点,你可以在你的<<
超载逻辑工作。
你可以这样说:
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;
其他已经说明了正确的方法。我想我会提到你做错了什么。
你定义一个操作,采用两个线对象:
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 <<
的惯例。
这是正确的声明,但是您没有解决函数体中的问题。 – 2010-09-14 13:50:19
如何写身体在我给出的链接中描述。例如有关于Point类的例子,它几乎与问题(Line)完全相同。所以我想出了一个链接到材料而不是c&p的概念(或者那里描述的想法)。 – 2010-09-14 13:56:58