将类对象转换为字符串

时间:2016-09-29 04:14:10

标签: c++ class overloading

我有一个类的赋值,它要求我使用两个必需的,讲师定义的空函数将类对象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;
}

1 个答案:

答案 0 :(得分:5)

问题的关键是to_string方法使用operator<<重载clock_time。很遗憾,operator<<重载使用to_string方法。显然这不起作用,因为它会永远绕圈子。

那么我们如何解决它以便它可以工作?

我们将to_stringoperator<<分开,以便他们不会互相打电话。

首先,让我们定义一个虚假的例子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_stringstring to_string(clock_time c) { ostringstream ss; ss << c; return ss.str(); } 已解除关联,to_string可用于operator<<。你可以反过来做,只要其中一个功能为另一个功能完成。两者都可以做所有的工作,但为什么呢?搞错了两倍的地方。