微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用 unique_ptr 作为成员类和列表

如何解决使用 unique_ptr 作为成员类和列表

我最近制作了一个包含 1 个超类和 2 个子类的应用程序。它的主要思想是将信息存储在 3 个不同的列表中。我的问题是,您可以对所有 3 个类只使用 1 个列表吗?尽管 2 个子类有一些额外的成员。有人告诉我,你可以使用 unique_ptr 作为超类的成员,并且只制作 1 个列表。我已经在互联网上阅读了它,但我无法完全理解。有什么建议么?感谢您抽出宝贵时间。

class Student {

     std::string Name;
     std::string Pinfo;
    std::map < std::string,float > Ngradelist;

public:

    std::string getName() {return Name;}

    std::string getPinfo() {return Pinfo;}

    virtual void InsertGradeList(std::string a,float b) {

        for(auto& it : Ngradelist)
            Ngradelist.insert(std::pair <std::string,float > (a,b));
    }

    Student( std::string n,std::string p,std::map < std::string,float > Ng) :
        Name(std::move(n)),Pinfo(std::move(p)),Ngradelist(std::move(Ng)) {}

    virtual void display() {

        std::cout << "Name: " << Name << std::endl;
        std::cout << "Personal information: " << Pinfo << std::endl;
        std::cout << "NCourse:" << std::endl;
        for(auto& it : Ngradelist)
            std::cout << "   " << it.first << "   Grade: " << it.second <<  std::endl;
    }
};

class HWStudent : public Student {

    std::string FieldOfWork;
    std::map<std::string,float> HWgradelist;

public:

    void InsertGradeList(std::string a,float b) override{

        for (auto &it : HWgradelist)
            HWgradelist.insert(std::pair<std::string,float>(a,b));
    }

    HWStudent(std::string n,std::map<std::string,float> Ng,std::string f,float> HWg) : Student(std::move(n),std::move(p),std::move(Ng)),FieldOfWork(std::move(f)),HWgradelist(std::move(HWg)) {}

    void display() override {

        Student::display();
        std::cout << "Field of Work: " << FieldOfWork << std::endl;
        std::cout << "HWCourse:" << std::endl;
        for(const auto& it : HWgradelist)
            std::cout << "   " << it.first << "   Grade: " << it.second <<  std::endl;
    }
};

class SWStudent : public Student {

    std::map<std::string,float> SWgradelist;
    std::list < std::string > Languages;

public:

    void InsertGradeList(std::string a,float b) override {

        for (const auto &it : SWgradelist)
            SWgradelist.insert(std::pair<std::string,b));
    }

    SWStudent(std::string n,std::list < std::string > l,float> SWg) : Student(std::move(n),Languages(std::move(l)),SWgradelist(std::move(SWg)) {}

    void display() override {

        Student::display();
        std::cout << "SWCourse:" << std::endl;
        for(const auto& it : SWgradelist)
            std::cout << "   " << it.first << "   Grade: " << it.second <<  std::endl;
        std::cout << "SW Languages:" << std::endl;
        for(const auto& it : Languages)
            std::cout << "   " << it << std::endl;
    }
};

std::list < Student > listaStudenti;
std::list < HWStudent > HWlistaStudenti;
std::list < SWStudent > SWlistaStudenti;

    void InsertListaStudenti(unsigned short option) {
        unsigned short numbers;
        std::string name,pinfo,course,fieldofwork,hwcourse,swcourse;
        std::string language;
        float grade = 0,hwgrade,swgrade;
        std::list < std::string > languagelist;
        if(option == 1) {
            std::cout << "Insert name: ";
            std::cin >> name;
            std::cout << "Insert personal information: ";
            std::cin >> pinfo;
            std::cout << "Insert course: ";
            std::cin >> course;
            std::cout << "Insert grade: ";
            std::cin >> grade;
            Student student(name,{{course,grade}});
            listaStudenti.push_back(student);
        }
        if(option == 2) {
            std::cout << "Insert name: ";
            std::cin >> name;
            std::cout << "Insert personal information: ";
            std::cin >> pinfo;
            std::cout << "Insert course: ";
            std::cin >> course;
            std::cout << "Insert grade: ";
            std::cin >> grade;
            std::cout << "Insert hwcourse: ";
            std::cin >> hwcourse;
            std::cout << "Insert hwgrade: ";
            std::cin >> hwgrade;
            std::cout << "Insert fieldofwork: ";
            std::cin >> fieldofwork;
            HWStudent hwstudent(name,grade}},{{hwcourse,hwgrade}});
            HWlistaStudenti.push_back(hwstudent);
        }
        if(option == 3) {
            std::cout << "Insert name: ";
            std::cin >> name;
            std::cout << "Insert personal information: ";
            std::cin >> pinfo;
            std::cout << "Insert course: ";
            std::cin >> course;
            std::cout << "Insert grade: ";
            std::cin >> grade;
            std::cout << "Insert swcourse: ";
            std::cin >> swcourse;
            std::cout << "Insert swgrade: ";
            std::cin >> swgrade;
            std::cout << "How many  languages: ";
            std::cin >> numbers;
            for(auto it = 0;it < numbers; ++it) {
                std::cout << "Insert language: ";
                std::cin >> language;
            languagelist.push_back(language);
            }
            SWStudent swstudent(name,languagelist,{{swcourse,swgrade}});
            SWlistaStudenti.push_back(swstudent);
        }
    }

int main() {

    unsigned short option = 10;
    while(option != 0) {
        std::cout << "1.Add student." << std::endl;
        std::cout << "2.Add HW student." << std::endl;
        std::cout << "3.Add SW student." << std::endl;
        std::cout << "4.display Student." << std::endl;
        std::cout << "5.display HW Student." << std::endl;
        std::cout << "6.display SW Student." << std::endl;
        std::cout << "0 is for exit." << std::endl;
        std::cout << "Option is : ";
        std::cin >> option;
        switch  (option) {
            case 0 : {
                std::cout <<" You chose to leave.";
                exit;
                break;
            }
            case 1 : {
               InsertListaStudenti(option);
                break;
            }
            case 2 : {
                InsertListaStudenti(option);
                break;
            }
            case 3: {
                InsertListaStudenti(option);
                break;
            }

            case 4: {

                for(auto &it : listaStudenti)
                    it.display();
                break;
            }
            case 5: {
                for(auto &it : HWlistaStudenti)
                    it.display();
                break;
            }
            case 6: {
                for(auto &it : SWlistaStudenti)
                    it.display();
                break;
            }
        }

    }
}

解决方法

你确实可以拥有

std::list<std::unique_ptr<Student>> students;

代替

std::list<Student> listaStudenti;
std::list<HWStudent> HWlistaStudenti;
std::list<SWStudent> SWlistaStudenti;
  • 插入类似于

    Student student(name,pinfo,{{course,grade}});
    students.push_back(std::make_unique<Student>(std::move(student)));
    // or std::make_unique<Student>(name,std::map<std::string,float>{{course,grade}})
    
    HWStudent hwstudent(name,grade}},fieldofwork,{{hwcourse,hwgrade}});
    students.push_back(std::make_unique<HWStudent>(std::move(hwstudent));
    

    代替

    Student student(name,grade}});
    listaStudenti.push_back(student);
    
    HWStudent hwstudent(name,hwgrade}});
    HWlistaStudenti.push_back(hwstudent);
    
  • 问题在于您的“过滤”:

    for (auto& student : SWlistaStudenti) {
        student.Display();
    }
    

    变成

    for (auto& studentPtr : SWlistaStudenti) {
        if (auto ptr = dynamic_cast<SWStudent*>(studentPtr.get())) ptr->Display();
    }
    

    但是(仅显示普通学生(不是 HW/SW))

    for(auto& student : listaStudenti) { student.Display(); }
    

    变成

    for (auto& studentPtr : students) {
        if (!dynamic_cast<SWStudent*>(studentPtr.get())
            && !dynamic_cast<HWStudent*>(studentPtr.get())) {
            studentPtr->Display();
        }
    }
    
  • 一个列表允许平等对待它们:

    要显示所有学生:

    for (auto& studentPtr : students) { studentPtr->Display(); }
    

    代替

    for (auto& student : listaStudenti) { student.Display(); }
    for (auto& student : HWlistaStudenti) { student.Display(); }
    for (auto& student : SWlistaStudenti) { student.Display(); }
    

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。