C++ 入门,小练习
类构造函数初始化列表继承纯虚函数多态overridevectorshared_ptrstring文件流虚函数设计#include iostream #include string #include vector #include fstream #include sstream #include memory #include cstring #include cstddef class Person { protected: int m_Id; std::string m_Name; public: Person(int id, const std::string name) : m_Id(id) , m_Name(name) { } const std::string GetName() const { return m_Name; } int GetId() const { return m_Id; } // 0 的意思是这个函数没有实现,Person 成了一个抽象类也叫接口类), Person p 错误 virtual void Print() const 0; virtual std::string GetType() const 0; virtual std::string Serialize() const 0; virtual ~Person() default; }; class Student : public Person { private: int m_Age; public: Student(int id, const std::string name, int age) : Person(id,name), m_Age(age) { } std::string GetType() const override { return Student; } std::string Serialize() const override { return Student, std::to_string(m_Id) , m_Name , std::to_string(m_Age); } void Print() const override { std::cout m_Id ,Name: m_Name ,Age: m_Age std::endl; } }; class Teacher : public Person { private: std::string m_Subject; public: Teacher(int id, const std::string name, const std::string subject) : Person(id,name), m_Subject(subject) { } std::string GetType() const override { return Teacher; } std::string Serialize() const override { return Teacher, std::to_string(m_Id) , m_Name , m_Subject; } void Print() const override { std::cout m_Id ,Name: m_Name ,Subject: m_Subject std::endl; } }; class Manager { private: std::vectorstd::shared_ptrPerson m_Persons; public: bool IsIdExist(int id) { for(const auto p : m_Persons) { if(p-GetId() id) return true; } return false; } void AddStudent(int id, const std::string name, int age) { if (IsIdExist(id)){ std::cout id ID alreay exists std::endl; return ; } m_Persons.push_back(std::make_sharedStudent(id,name,age)); } void AddTeacher(int id, const std::string name, const std::string subject) { if (IsIdExist(id)){ std::cout id ID alreay exists std::endl; return ; } m_Persons.push_back(std::make_sharedTeacher(id,name,subject)); } int Delete(int id) { for(auto it m_Persons.begin(); it ! m_Persons.end(); it) { if ((*it)-GetId() id ){ m_Persons.erase(it); return 0; } } return -1; } std::shared_ptrPerson Search(const std::string name) { for(auto it m_Persons.begin(); it ! m_Persons.end() ; it) { if((*it)-GetName() name){ return *it; } } return nullptr; } void ShowAll() const { for(const auto p : m_Persons) { p-Print(); } } void Save() { std::ofstream file(person.txt); if(!file){ std::cerr cant open file std::endl; return ; } for(const auto p : m_Persons) { file p-Serialize() \n; } } void Load() { std::ifstream file(person.txt); if(!file){ std::cerr cant open file std::endl; return ; } m_Persons.clear(); std::string line; while(std::getline(file,line)) { std::stringstream ss(line); std::string type, token, name, extra; int id; std::getline(ss, type, ,); std::getline(ss, token, ,); id std::stoi(token); std::getline(ss, name, ,); std::getline(ss, extra, ,); if (type Student) { int age std::stoi(extra); m_Persons.push_back(std::make_sharedStudent(id, name, age)); } else if (type Teacher) { m_Persons.push_back(std::make_sharedTeacher(id, name, extra)); } } std::cout 数据已从文件加载。 std::endl; } }; int main() { Manager manager; manager.AddStudent(1,sir,30); manager.AddStudent(2,gir,27); manager.AddStudent(3,kil,25); manager.AddTeacher(3,kk,match); manager.AddTeacher(5,jjl,chinese); manager.AddTeacher(6,ww,program); manager.ShowAll(); std::cout test 1 std::endl; if(manager.Delete(1) 0) std::cout Delete not found std::endl; if(manager.Delete(3) 0) std::cout Delete not found std::endl; if(manager.Delete(6) 0) std::cout Delete not found std::endl; manager.ShowAll(); std::cout test 2 std::endl; auto p manager.Search(gir); if (p){ std::cout p-GetType() std::endl; p-Print(); }else{ std::cout Search not found std::endl; } p manager.Search(kk); if (p){ std::cout p-GetType() std::endl; p-Print(); }else{ std::cout Search not found std::endl; } std::cout test 3 std::endl; manager.AddStudent(7,qq,26); manager.AddTeacher(8,yy,program); manager.ShowAll(); std::cout test 4 std::endl; manager.Save(); manager.Load(); manager.ShowAll(); return 0; }