题目:
实现简易的生日备忘录。温暖的亲情是前进的动力,别忘记在家人生日时送 去祝福。定义类 Member 描述家庭成员,每位家人有自己的姓名 name 和出生日期 birthday,出生日期应描 述为由 year、month、day 组成的 Date 类。在 main 函数中定义数组(或 STL 容器)存放家庭成员对象,并 调用类的成员函数,按照生日先后顺序输出各位家庭成员的信息。
方法:重载关系运算符
通过重载关系运算符进行自定义排序。
1.
先定义Date类,重载"<",使之能按照日期进行排序。同时重载输出"<<"使之能输出日期。
2.
定义Member类,第二次重载"<",使每个成员能按照生日的日期进行排序。同时可以再次 重载"<<",使之能输出家庭成员。
3.
经过两次对小于号的重载,我们现在已经可以使用sort(member,member+n)对成员进行排序。大致演化过程为:对member成员进行排序——>对member成员的日期进行排序(如果没有第二次对"<"号的重载,想达到相同效果,需要使用sort(member,member+n,comp),自定义comp按照生日日期排序)——>调用"<"的第一个重载对日期排序。
代码:
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
class Date {
private:
size_t year, month, day;
public:
Date(size_t y = 0, size_t m = 0, size_t d = 0) :year(y), month(m), day(d) {}
bool operator < (const Date& rhs) const {
if (this->year < rhs.year)
return true;
else if (this->year == rhs.year && this->month < rhs.month)
return true;
else if (this->year == rhs.year && this->month == rhs.month
&& this->day < rhs.day)
return true;
else
return false;
}
friend ostream& operator << (ostream& os, const Date& rhs) {
os << rhs.year << "-" << rhs.month << "-" << rhs.day;
return os;
}
};
class Member {
private:
string name;
Date birthday;
public:
Member(const char* n = "", size_t y = 0, size_t m = 0, size_t d = 0)
:name(n), birthday(y, m, d) {}
bool operator < (const Member& rhs) const {
return this->birthday < rhs.birthday;
}
friend ostream& operator << (ostream& os, const Member& rhs) {
os << rhs.name << ": " << rhs.birthday;
return os;
}
};
int main() {
Member m[]{ Member{"father", 1980, 6, 12}, Member{"mother", 1982, 2, 28},
Member{"son", 2002, 1, 1} };
sort(m, m + size(m));
for (auto x : m)
cout << x << endl;
}