我已经在C ++中遇到了几个小时的问题,即使在调试器的帮助下,我也无法弄清楚发生了什么。
我正在尝试创建一个Date
课程(不开玩笑)代表日期,包括日期,月份和年份。我还想重载主运算符(++, - ,+ =, - =,+)。
由于我无法看到的原因,除了运算符'+'之外,一切似乎都运行良好。
这是我的头文件:
#include <ostream>
class Date {
public:
Date(int year, int month, int day);
~Date();
Date(const Date& date);
Date &operator+(int days);
private:
int m_year;
int m_month;
int m_day;
friend std::ostream &operator<<(std::ostream &os, const Date &date);
};
这是我的C ++文件:
#include "Date.h"
using namespace std;
Date::Date(int year, int month, int day)
: m_year(year),
m_month(month),
m_day(day)
{}
Date::~Date() {}
Date::Date(const Date &date)
: m_year(date.m_year),
m_month(date.m_month),
m_day(date.m_day)
{}
ostream &operator<<(ostream &os, const Date &date) {
os << date.m_day << ", " << date.m_month << " " << date.m_year;
return os; <---- debug point A
}
Date &Date::operator+(int days) {
Date newDate(*this);
newDate.m_day = newDate.m_day + days;
return newDate; <---- debug point B
}
我的主要档案:
#include "Date.h"
#include <ostream>
using namespace std;
int main(int argc, char *argv[])
{
Date date(2013, 12, 12);
cout << date << endl;
cout << date + 2 << endl;
return 0;
}
输出是:
12, 12 2013
1359440472, 12 2013
Process finished with exit code 0
我不明白这个1359440472来自哪里!!
我试图放置调试点(如上所示),输出如下:
Debug point A:
date = {const Date &}
m_year = {int} 2013
m_month = {int} 12
m_day = {int} 12
Debug point B:
this = {Date * | 0x7fff5c5ddac0} 0x00007fff5c5ddac0
m_year = {int} 2013
m_month = {int} 12
m_day = {int} 12
days = {int} 2
newDate = {Date}
m_year = {int} 2013
m_month = {int} 12
m_day = {int} 14
Debug point A:
date = {const Date &}
m_year = {int} 2013
m_month = {int} 12
m_day = {int} 1549654616
我无法解释!!最后两个调试检查点之间没有任何步骤,“14”已成为“1549654616”......
类型int
可能是一个问题(因为它似乎距离2 ^ 24不远)或运算符+有问题,但我看不到如何解决它。
感谢您的帮助, 编
答案 0 :(得分:1)
你正在返回一个悬空参考。
任何事情都可能发生。
按值operator+
返回。
答案 1 :(得分:0)
您将返回对具有自动存储持续时间的变量的引用。
这样做的行为是未定义的。
修复是返回值,而不是引用。依靠命名的返回值优化来避免明显的深层复制。