[英]Why do I need to use a const reference parameter in a << overloading function when using an overloaded post-decrement operator?
[英]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.