我正在编写自己的整数类,可以处理任何大小的整数。到目前为止,我成功地重载了以下运算符:=,+, - ,*,/,%,>,<,> =,< =,==,!=,+ =, - =,* =,/ =和%=。
现在,我正在尝试重载<<
运算符以模仿以下代码行中int的行为:
int a = 5;
std::cout << a;
我一直在研究如何做到这一点,到目前为止,我发现的是:
std::ostream& operator<<(std::ostream& os, const T& obj)
{
// Write obj to stream
return os;
}
但是,如果我想将某些东西流入我的对象(也就是说,在我的对象的右侧有<<
),这似乎就是这样。但我想改变<<
在我对象的左侧时的行为。
如何设置operator<<
功能以允许我将数据流式传输到cout(或任何其他ostream
)?
答案 0 :(得分:2)
如何设置运算符&lt;&lt;函数允许我将数据流式传输到cout(或任何其他ostream)?
你在这里做的方式:
std::ostream& operator<<(std::ostream& os, const T& obj)
{
// write obj to stream
return os;
}
正如其他人在评论中有用地指出的那样,你需要将它放在整数类之外作为一个&#34;自由函数&#34;。它仍然可以是整数类的成员,但是,就是这样。
但是,如果我想将某些内容传输到我的对象中,这似乎就是这样。 (即具有&lt;&lt;&lt;&lt;&lt;&lt;&lt;&#;但我想改变&lt;&lt;的行为当它在我对象的左侧时。
我不确定你从哪里得到它,但第一个参数是左侧参数,它是你的情况下的输出流,第二个参数是你的整数类的实例,它被写入该输出流。
答案 1 :(得分:1)
在C ++流中,
std::cout << a;
只是
的语法糖operator<<(std::cout, a);
匹配签名
std::ostream& operator<<(std::ostream& os, const int &a);
同样,
std::cout << myBigInt;
是
的语法糖operator<<(cstd::cout, myBigInt);
因此,您发布的代码段启用了语法
os << obj; // os is an ostream; obj is a T
换句话说,<<
位于obj
和/或myBigInt
的左侧,因为二元运算符介于函数参数列表中看到的两个操作数之间