重载时获取堆栈溢出 >> 运算符函数是为类调用的。我需要进行哪些更改?
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
,以避免这种意外的转换。
相关文章:
- 'short int'持有的值溢出,但"自动"不会溢出?
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- 大于65535的C++数组[size]引发不一致的溢出
- 为什么我在leetcode上收到AddressSanitizer:地址0x602000000058上的堆缓冲区溢出错误
- C++中无符号字符溢出
- EASTL矢量<向量<int>>连续的
- 在 leetcode 上提交解决方案时出现堆栈缓冲区溢出错误
- 我的 int main() 中出现堆栈溢出错误
- 整数溢出,最大值为 pow(10,19)
- 获取隐式转换溢出从无符号到已签名的警告
- 使用 strcat 获取缓冲区溢出错误
- LeetCode 1:两和 - 地址清理器:堆缓冲区溢出地址
- 给定一个类型,如何派生一个泛型更广泛的类型(例如,用于溢出安全求和)?
- C++ 对象数组堆栈溢出
- 使用提升::lexical_cast捕获溢出
- C++ Unordered_set功能中的溢出
- 自定义排序函数中的堆溢出
- 使用向量的缓冲区溢出
- 有没有一种方法可以捕获进程中的堆栈溢出?C++Linux
- c++中栈溢出和分段错误的危险