我有一个类的赋值,它要求我使用两个必需的,讲师定义的空函数将类对象clock_time
转换为字符串:to_string()
和重载的<<运营商。我无法让它工作,我不确定为什么。
clock_time::clock_time(int h, int m, int s)
{
set_time(h, m, s);
}
void clock_time::set_time(int h, int m, int s)
{
_seconds = h * 3600 + m * 60 + s;
}
string to_string(clock_time c)
{
ostringstream ss;
ss << c;
return ss.str();
}
ostream& operator<<(ostream &out, clock_time c)
{
out << to_string(c);
return out;
}
答案 0 :(得分:5)
问题的关键是to_string
方法使用operator<<
重载clock_time
。很遗憾,operator<<
重载使用to_string
方法。显然这不起作用,因为它会永远绕圈子。
那么我们如何解决它以便它可以工作?
我们将to_string
和operator<<
分开,以便他们不会互相打电话。
首先,让我们定义一个虚假的例子clock_time
,因为它已经丢失,如果没有它我们就不能做杰克。
class clock_time
{
int hour;
int minute;
int second;
public:
friend std::ostream& operator<<(std::ostream &out, clock_time c);
}
请注意operator<<
作为friend
的{{1}}函数的声明。这允许clock_time
打破封装并使用operator<<
的私有成员。根据{{1}}的定义方式,这可能没有必要,但对于这个例子,它几乎是整个shebang的关键。
接下来,我们实施clock_time
clock_time
我选择了这种输出格式,因为这是我期望在数字时钟上看到的。最少惊喜法则说给人们所期望的东西,你会有更少的错误和不良情绪。混淆了人们......记得当微软从Windows 8中取出开始菜单时发生了什么?或者当可口可乐改变他们的公式?
由于个人喜好,我先做operator<<
。我宁愿在这里做咕噜咕噜的工作,因为在我的大脑上比在ostream& operator<<(ostream &out, clock_time c)
{
out << c.hour << ":" << c.minute << ":" << c.second;
return out;
}
出于某种原因更容易。
现在我们已准备好实施operator<<
功能。
to_string
惊喜!它与OP最初实现它完全相同。由于to_string
和string to_string(clock_time c)
{
ostringstream ss;
ss << c;
return ss.str();
}
已解除关联,to_string
可用于operator<<
。你可以反过来做,只要其中一个功能为另一个功能完成。两者都可以做所有的工作,但为什么呢?搞错了两倍的地方。