将类对象转换为字符串

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)

use*_*301 6

问题的症结在于该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.你可以反过来做,只要其中一个功能为另一个功能完成.两者都可以做所有的工作,但为什么呢?两倍的地方搞砸了.