繁体   English   中英

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

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

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

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 ,以避免此类意外的转换。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM