Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 关于向量推回和返回指针_C++ - Fatal编程技术网

C++ 关于向量推回和返回指针

C++ 关于向量推回和返回指针,c++,C++,我有一个问题与School::addStudent(…) 这是来自班级学校编码 class School { string schoolName ; vector<Student> students; public: School(const string& _schoolName) : schoolName(_schoolName) {} Student* addStudent(const s

我有一个问题与
School::addStudent(…)

这是来自
班级学校
编码

    class School {

        string schoolName ;
        vector<Student> students;
    public:
        School(const string& _schoolName) : schoolName(_schoolName) {}
        Student* addStudent(const string& name, MajorType majorType) {
        students.push_back(Student(name, 0, majorType));
        return &students[students.size()-1];
        }
    Student* addStudent(const string& name, const float gpa) {
        students.push_back(Student(name, gpa, UD));
        return &students[students.size()-1];
        }
    ...
    }
这是专业课

    class Major { 
        MajorType majorType ;
    public:
        Major(const MajorType _majorType) : majorType(_majorType) {}
    
        MajorType getmajorType() const {
            return majorType;
        }
        void setMajor(const MajorType _majorType) {
            majorType=_majorType;
        }
    };

这是一个简单的枚举。如果你想,跳过

    enum MajorType {CE, EE, ME, UD};

问题就在这里。 当我用这种方式编写
Student*addStudent
代码时,效果很好

但是当我编码
Student*addStudent

        Student* addStudent(const string& name, MajorType majorType) {
            Student* tmp = new Student();
            tmp->set(name, majorType);
            students.push_back(*tmp);
            return tmp;
        }
        Student* addStudent(const string& name, const float gpa) {
            Student* tmp = new Student();
            tmp->set(name, gpa);
            students.push_back(*tmp);
            return tmp;
        }
这样就不行了。 它确实可以编译,但是当它在主代码中点击kim->setGPA时,下面的数字不会进入矢量学生。我认为这与内存地址和按值复制有关,但我不知道为什么我的代码会出错

对于那些想知道后一个代码结果的人

学校名称:PNU,计数:4 姓名:Kim GPA:0专业:电气工程。 姓名:洪GPA:0专业:计算机工程。 姓名:李GPA:4专业:待定。 姓名:Joo GPA:1.5专业:待定

主代码有一些关于Kim和Hong的GPA以及Lee和Joo的专业的输入,但代码就是不起作用


感谢您阅读我的这个长长的问题,如果您能解决这个问题,我将不胜感激,因为我从昨天开始就在思考这个问题

如果您的编译器支持Cpp11,请替换

 vector<Student> students;

你被错误地认为“这种方式”工作“很好”。任何向后推入向量的
都会重新分配向量,使指向该向量的所有现有指针无效。这恰好是您以前调用
addStudent
()时返回的。接着是山丘。哦,“不工作”的好版本也被打破了,但方式完全不同。由于不同的原因,
addStudent
显示的备选方案都不能正常工作。您可以分配一个新学生。你安排了新学生。然后你复制学生并将副本放入向量中。然后返回指向原始学生的指针。当然,如果你改变原来的学生,它不会改变副本,因为副本是一个完全不同的学生。你的具体问题是什么?我觉得你写的东西太多了。很好,你做了一些研究,尝试了不同的东西,但这让问题很难理解。请尝试将您的代码缩减为一。@SamVarshavchik您确定任何
推回
都可以重新分配吗?我认为只有当容量等于大小时,
push_back
才能重新分配。(这样,如果您
保留
向后推
在容量满之前不得重新分配。)@DanielLangr
addStudent
没有记录到对
student
容量有先决条件,因此可以调用
addStudent
重新分配
 vector<Student> students;
 vector<std::shared_ptr<Student>> students;
Student* addStudent(const string& name, const float gpa) {
    Student* tmp = new Student();
    tmp->set(name, gpa);
    students.push_back(*tmp);
    return tmp;
}