Files
SH-Quizzes/ACMOJ-2059.h
2023-12-23 22:23:48 +08:00

86 lines
2.0 KiB
C++

#include <iostream>
#include <map>
#include <string>
class Student {
public:
static std::map<int, Student *> id2student;
static std::map<std::string, Student *> name2student;
enum class Gender { Boy, Girl };
private:
int id;
std::string name;
int age;
Gender gender;
public:
// 从输入流构造
// 输入格式与输出格式一致
// 输出函数已给出
Student(std::istream &is) {
std::string tmp_gender;
is >> id >> name >> age >> tmp_gender;
if (tmp_gender == "boy")
gender = Gender::Boy;
else
gender = Gender::Girl;
id2student[id] = this;
name2student[name] = this;
}
// 人无法被复制(至少不应该)
Student(Student const &rhs) = delete;
Student &operator=(Student const &rhs) = delete;
// 你需要支持的操作
Student(Student &&rhs) {
id = rhs.id;
name = rhs.name;
age = rhs.age;
gender = rhs.gender;
rhs.id = 0;
id2student[id] = this;
name2student[name] = this;
}
Student &operator=(Student &&rhs) {
if ((&rhs) != this) {
if (id != 0) {
id2student.erase(id);
name2student.erase(name);
}
id = rhs.id;
name = rhs.name;
age = rhs.age;
gender = rhs.gender;
rhs.id = 0;
id2student[id] = this;
name2student[name] = this;
}
return *this;
}
~Student() {
if (id != 0) {
id2student.erase(id);
name2student.erase(name);
}
}
Student &rename(std::string const &str) & {
name2student.erase(name);
name = str;
name2student[name] = this;
return *this;
}
Student rename(std::string const &str) && {
name2student.erase(name);
name = str;
name2student[name] = this;
Student tmp(std::move(*this));
return std::move(tmp);
}
friend std::ostream &operator<<(std::ostream &os, Student &stu) {
return os << stu.id << ' ' << stu.name << ' ' << stu.age << ' '
<< (stu.gender == Student::Gender::Boy ? "boy" : "girl");
}
};