繁体   English   中英

C++ 将对象存储在列表中的问题

[英]C++ problem with storing objects in a list

这是我的代码:

class Student {
   
    const std::string& Name;
    const std::string& Pinfo;
    std::map < std::string, float > Ngradelist;
    
public:

    Student(const std::string& n, const std::string& p, std::map < std::string, float > Ng) :
            Name(n), Pinfo(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(const auto& it : Ngradelist)
                std::cout << "   " << it.first << "   Grade: " << it.second <<  std::endl;
        }
    };

    void InsertListaStudenti(Student& student, std::list < Student > &listaStudenti) {

        listaStudenti.push_front(student);
    }



int main ()  {

    std::list < Student > listaStudenti;

    unsigned short option = 10;

    while(option != 0) {

        std::cout << "1.Add student." << std::endl;
        std::cout << "4.Display 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 : {

                std::string name , pinfo, course;
                float grade = 0;
                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, pinfo, {{course, grade}});
            //    listaStudenti.push_back(student);
               InsertListaStudenti(student,listaStudenti);
                break;
            }
            case 4: {

                for(auto &it : listaStudenti)
                    it.Display();
                break;
            }
        }
    }
}

该代码可以在不使用存储这些数据的列表的情况下正常工作。 当我添加一个学生时,没有问题,但是当我添加第二个学生时,第一个学生的NamePinfo将更改为第二个学生的NamePinfo

我将举一个例子,以便您可以更好地理解:

学生 1 有这些数据: Name=aPinfo=aCourse=agrade=1 学生 2 有这些数据: Name=bPinfo=bCourse=bgrade=2

如果我想显示,它会是这样的:学生 1 将有 bba 1,学生 2 将有 bbb 2

有谁知道我能做些什么来完成这项工作? 我相信每次我主要创建一个新的 object 时,这两个字段( NamePinfo )都会被覆盖,但我不确定......

这是您定义Student成员的方式:

const std::string& Name;
const std::string& Pinfo;

您将它们声明为引用,这意味着它们将引用main function 中的原始变量。 这将导致未定义的行为,因为这些变量的生命周期是有限的,并且原始字符串将不复存在。

改用普通的非引用(和非常量)变量:

std::string Name;
std::string Pinfo;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM