Wal*_*rty 2 c++ overloading class
我有一个类的赋值,它要求我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;
}
Run Code Online (Sandbox Code Playgroud)
问题的症结在于该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);
}
Run Code Online (Sandbox Code Playgroud)
注意operator<<作为s 的friend函数的声明clock_time.这允许operator<<打破封装并使用私有成员clock_time.这可能不是必要的,这取决于如何clock_time定义,但对于这个例子,它几乎是整个shebang的关键.
接下来我们实施 operator<<
ostream& operator<<(ostream &out, clock_time c)
{
out << c.hour << ":" << c.minute << ":" << c.second;
return out;
}
Run Code Online (Sandbox Code Playgroud)
我选择了这种输出格式,因为它是我期望在数字时钟上看到的.最少惊喜法则说给人们所期望的东西,你会有更少的错误和不良情绪.混淆了人们......记得当微软从Windows 8中取出开始菜单时发生了什么?或者当可口可乐改变他们的公式?
operator<<因为个人喜好,我先做.我宁愿在这里做咕噜咕噜的工作,因为在我的大脑上比在to_string某些原因上做的更容易.
现在我们已准备好实现该to_string功能.
string to_string(clock_time c)
{
ostringstream ss;
ss << c;
return ss.str();
}
Run Code Online (Sandbox Code Playgroud)
惊喜!它与OP最初实现它完全相同.因为to_string并且operator<<已经解耦,operator<<可以使用to_string.你可以反过来做,只要其中一个功能为另一个功能完成.两者都可以做所有的工作,但为什么呢?两倍的地方搞砸了.
| 归档时间: |
|
| 查看次数: |
8944 次 |
| 最近记录: |