何时定义ostream运算符<<一堂课?

时间:2009-02-02 06:12:19

标签: c++

问题可能是主观的,所以

的语法
std::ostream& operator << (std::ostream & o, const SomeClass &a) {
    return o << a.accessor().. ; 
}

你通常什么时候为你写的课程定义这个,你什么时候避免为你的班级写这个朋友的功能。

7 个答案:

答案 0 :(得分:8)

如果我想要流式传输一个类,我通常会这样写:

std::ostream& operator << (std::ostream& o, const SomeClass& a)
{
    a.print(o);
    return o; 
}

然后在SomeClass上打印一个const方法,该方法知道如何将类序列化为流。

答案 1 :(得分:4)

我只会重载运算符&lt;&lt;什么时候与流媒体有关,或者与移动有关,而且课程纯粹是数字。对于将某些内容写入ostream,就像在代码中一样,我认为这很好。我认为,其他任何事情都会引起混淆,我最好将成员函数用于其他目的。另一个应用程序,我认为我仍然会作为规则的例外,做这样的事情:

StringList list;
list << "foo" << "bar" << "baz";

这是Qt如何使用它的字符串列表,我发现它非常好。

答案 2 :(得分:3)

上面马丁回答的一个好处是你也可以免费获得多态性。如果您使print(ostream&)成为虚拟功能,那么&lt;&lt;运算符也像虚函数一样!

关于何时重载运算符,只要您认为该类应该能够写入流(文件,套接字等等),就可以这样做。这甚至可能仅用于调试目的。能够输出类的内部结构通常很有用,因此重载此运算符没有真正的缺点。

答案 3 :(得分:2)

我会考虑将它用于记录等事情。所以你可以这样做:

SystemLog systemLog;
systemLog << "Processing Item #15";
systemLog << "Error 0014: Bad things happened.";
systemLog << system.executeCommand(cmd); // returns a result string

或者也许是为了网络:

NetworkInterface networkInterface;
string message("Hello World! I'm a server.");
networkInterface << message;

当然,将这些东西作为常规功能实现也是可能的,并且可能更可取。通常,您应该注意运算符重载。只有当它真的适合时才使用它。

答案 4 :(得分:1)

我从来没有在生产代码中重载过这个。

虽然您可能希望在记录很多内容时执行此操作,但这样做很有用。

答案 5 :(得分:0)

如果且仅当我打算使用该运算符时,我才会实现此功能。这几乎从未......我没有实现它的理由因此没有使用它。如果它是公开使用然后包含它是为了完整性,但当然我不会在你自己的项目中的每个类中包含它,因为在大多数情况下你不需要输出类到流。例如如果将入口点包装在一个类中,提供此运算符将毫无意义。

答案 6 :(得分:0)

我经常这样做,因为它将对象转储到日志中以便调试非常方便。

相关问题