重载时获取堆栈溢出 >> 运算符函数是为类调用的。我需要进行哪些更改?

Getting stack overflow when overloaded >> operator function is called for a class. What changes do i need to make?

本文关键字:gt 栈溢出 堆栈 获取 运算符 函数 调用 重载      更新时间:2023-10-16

以下是>>运算符重载的类文件。

class Timepoint {
public:
    Timepoint();
    Timepoint(unsigned short yearValue = 9999, unsigned short month = 12, unsigned short date = 31, unsigned short hour = 23, unsigned short minute = 59);
    ~Timepoint();
    unsigned short get_dayOfYear();
    void operator++();
    friend std::ostream& operator<<(std::ostream& out, const Timepoint& timepoint);
    friend std::istream& operator>>(std::istream&, const Timepoint&);
private:
    unsigned short dayOfYear;
    unsigned short year;
    unsigned short time;
    const static short days[];
};

下面是触发堆栈溢出误差的过载函数。我必须花时间作为用户的时间戳,并将其存储在对象数据中。当控件到达此功能时,堆叠溢出将被触发。

std::istream& operator>>(std::istream& in, const Timepoint& timepoint)
{
    int day, month, hour, minute;
    std::string timestamp;
    in >> timestamp;
    std::stringstream ss(timestamp);
    ss >> timepoint.year;
    ss.ignore();
    ss >> month;
    ss.ignore();
    ss >> day;
    ss.ignore();
    ss >> hour;
    ss.ignore();
    ss >> minute;
    const_cast<Timepoint&>(timepoint).dayOfYear = timepoint.days[month] + day;
    const_cast<Timepoint&>(timepoint).time = hour * 60 + minute;
    return in;
}

ss >> timepoint.year被解释为

ss >> Timepoint(timepoint.year);

这是阅读const unsigned short的唯一可行方法。这当然会导致无限的递归。

根本原因是,您莫名其妙地将const对象传递给其明确目标是修改该对象的函数。只需删除const

您可能还想制作构造函数explicit,以避免这种意外的转换。