如何乘以和除以一天中的时间,例如10:00 和 5:00 具有重载功能?
Posted
技术标签:
【中文标题】如何乘以和除以一天中的时间,例如10:00 和 5:00 具有重载功能?【英文标题】:How to multiply and divide times of the day e.g. 10:00 and 5:00 with overloaded functions? 【发布时间】:2013-07-03 02:33:51 【问题描述】:好的,这是我编辑的代码,但现在每次编译时都会出现分段错误(核心转储)。我哪里出错了?我不确定我是否正确地“回溯”了它,但这就是我尝试得到的结果:程序收到信号 SIGSEGV,分段错误。 MyTime::MyTime 中的 0x000109f0 (this=, h=, m=) 在 MyTime.cc:10 10 MyTime::MyTime(int h, int m)
//MyTime.h File
#include <iostream>
class MyTime
public:
MyTime(int h = 0, int m = 0);
void Reset(int h, int m);
void input();
void output() const;
MyTime operator + (const MyTime& t1) const;
MyTime operator - (const MyTime& t1) const;
MyTime operator * (const int& num) const;
MyTime operator / (const int& num) const;
bool operator == (const MyTime& t1) const;
bool operator < (const MyTime& t1) const;
bool operator <= (const MyTime& t1) const;
int get_hours() constreturn hours;
int get_minutes() constreturn minutes;
private:
void simplify();
int hours; // hours can be > 24
int minutes; // 0 <= minutes <= 59
;
std::istream& operator >>(std::istream& fin, MyTime& t);
std::ostream& operator <<(std::ostream& fout, const MyTime& t);
//MyTime.cc File
#include "MyTime.h"
#include <cstdlib>
#include <iostream>
#include <iomanip>
using namespace std;
// Constructor
MyTime::MyTime(int h, int m)
hours = h;
minutes = m;
void MyTime::Reset(int h, int m)
hours = h;
minutes = m;
void MyTime::simplify()
hours += minutes/60;
minutes = minutes%60;
void MyTime::input()
char junk;
cin >> hours;
cin.get(junk);
cin >> minutes;
simplify();
void MyTime::output() const
cout << hours << ':' << setw(2) << setfill('0') << minutes;
MyTime MyTime::operator +(const MyTime& t1) const
MyTime tmp;
tmp.hours = t1.hours + hours;
tmp.minutes = t1.minutes + minutes;
tmp.simplify();
return tmp;
MyTime MyTime::operator -(const MyTime& t1) const
MyTime tmp;
tmp.minutes = abs((t1.hours*60+t1.minutes) -
(hours*60+minutes));
tmp.simplify();
return tmp;
MyTime MyTime::operator /(const int& num) const
MyTime tmp;
tmp.minutes = hours * 60 + minutes;
tmp.minutes /= num;
tmp.simplify();
return tmp;
MyTime MyTime::operator *(const int& num) const
MyTime tmp;
tmp.minutes = hours * 60 + minutes;
tmp.minutes *= num;
tmp.simplify();
return tmp;
bool MyTime::operator == (const MyTime& t1) const
return t1.hours == hours && t1.minutes == minutes;
bool MyTime::operator < (const MyTime& t1) const
return (t1.hours * 60 + t1.minutes) < (hours * 60 + minutes);
bool MyTime::operator <=(const MyTime& t1) const
return (t1 == (hours * 60 + minutes)) || (t1 < (hours * 60 + minutes));
ostream& operator <<(ostream& fout, const MyTime& t)
t.output();
return fout;
istream& operator >>(istream& fin, MyTime& t)
t.input();
return fin;
//main.cc File
#include <iostream>
#include "MyTime.h"
int main()
MyTime t1, t2;
int scalar;
std::cout << "Enter a time: ";
std::cin >> t1;
std::cout << "Enter another time: ";
std::cin >> t2;
std::cout << "Enter a scalar to manipulate those times: ";
std::cin >> scalar;
if(t1 == t2)
std::cout << t1 << " is equal to " << t2 << std::endl;
if(t1 < t2)
std::cout << t1 << " is less than " << t2 << std::endl;
if(t1 <= t2)
std::cout << t1 << " is less than or equal to " << t2 << std::endl;
std::cout << t1 << " + " << scalar << " = " << t1 + scalar << std::endl;
std::cout << t1 << " - " << scalar << " = " << t1 - scalar << std::endl;
std::cout << t1 << " * " << scalar << " = " << t1 * scalar << std::endl;
std::cout << t1 << " / " << scalar << " = " << t1 / scalar << std::endl;
std::cout << t2 << " + " << scalar << " = " << t2 + scalar << std::endl;
std::cout << t2 << " - " << scalar << " = " << t2 - scalar << std::endl;
std::cout << t2 << " * " << scalar << " = " << t2 * scalar << std::endl;
std::cout << t2 << " / " << scalar << " = " << t2 / scalar << std::endl;
return 0;
【问题讨论】:
什么是 10:00 乘以 5:00? 一个 TimeSpan 除以一个 TimeSpan 是一个比例因子,一个比例因子乘以一个 TimeSpan 是另一个 TimeSpan。将两个 TimeSpan 样式的对象相乘是没有意义的。 您在比较函数中得到了this
和t1
的切换。
另外,表达式 t1 == hours * minutes
使用从 int 到 MyTime
的隐式转换(minutes
默认为 0)。它被解释为t1.operator==(MyTime(hours := this->hours * this->minutes, minutes := 0))
【参考方案1】:
首先,理清单位,例如:时间乘以时间是没有意义的。 时间加上或减去时间就是时间。 时间乘以或除以一个数字就是时间。
接下来,将时间内部存储为分钟。转换为小时和分钟供人类使用。
之后,其余的将就位。
【讨论】:
【参考方案2】:对于乘法和除法,如果时间格式正确,MyTime::simplify 什么也不做。如果 0
对于你的第二个问题,切换
(t1.hours * 60 + t1.minutes) < (hours * 60 + minutes)
到
(hours * 60 + minutes) < (t1.hours * 60 + t1.minutes)
这样操作符 实际上是在运算符的左侧评估 this,因为你已经把它放在你的重载中。this < t1
【讨论】:
我知道这很奇怪,但这是我班级的作业,这是我的教授要求的,或者至少我是这样解释的。这是他给我的说明:我已经在 ~jdolan/cs2401/hw/hw1 中提供了这个类的一个版本,您可以使用 cp 命令将其复制到您自己的目录中。在此示例中,您将看到我实现了四个算术运算符、两个布尔运算符以及输入和输出运算符。他们都被实现为朋友。 您的任务是在不使用好友的情况下实现所有运算符。对于布尔和算术运算符,您应该通过使运算符成为 MyTime 类的成员来做到这一点,对于 I/O 运算符,您应该通过在类中编写执行运算符工作的输入和输出函数来做到这一点,然后让操作员调用该成员函数。数学和布尔运算符应使用 const 来保护用作左侧操作数的对象。我还要求您使用默认参数将两个构造函数组合成一个构造函数。 完成后,您应该编写一个允许用户输入两次的应用程序,使用重载的输入运算符和一个标量,然后查看执行的所有数学运算和 2 个布尔运算符这些数字。 这些都是我按照他的要求做的指示吗? 任何人我都需要把这个交上来。以上是关于如何乘以和除以一天中的时间,例如10:00 和 5:00 具有重载功能?的主要内容,如果未能解决你的问题,请参考以下文章
熊猫方式将一天中的时间(有效的 datetime.time)转换为浮点变量
如何使数字显示为 hh:mm(持续时间,而不是一天中的时间)