Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/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++;OOP基础知识-正确返回对象引用? 我正在学习C++,并且有一个问题,它是作为一个引用返回的对象,我想继续使用和修改它。_C++_Oop - Fatal编程技术网

C++;OOP基础知识-正确返回对象引用? 我正在学习C++,并且有一个问题,它是作为一个引用返回的对象,我想继续使用和修改它。

C++;OOP基础知识-正确返回对象引用? 我正在学习C++,并且有一个问题,它是作为一个引用返回的对象,我想继续使用和修改它。,c++,oop,C++,Oop,我有两个班,大学和学生 University被实例化并具有addStudent()方法,该方法将新的Student对象存储在University的私有向量数据成员中。我希望该方法返回对新创建的Student对象的引用。然后我想调用returend对象上的Student::addCourse()方法,将一些课程添加到学生的“成绩单”中 我认为,由于我返回了一个对Student对象的引用,它将更新自身存储在University对象中的_Students向量中,因此这些更改将在其范围之外可见,但它不会

我有两个班,大学和学生

University被实例化并具有addStudent()方法,该方法将新的Student对象存储在University的私有向量数据成员中。我希望该方法返回对新创建的Student对象的引用。然后我想调用returend对象上的Student::addCourse()方法,将一些课程添加到学生的“成绩单”中

我认为,由于我返回了一个对Student对象的引用,它将更新自身存储在University对象中的_Students向量中,因此这些更改将在其范围之外可见,但它不会保留这些更改

当我对返回的Student对象调用printTranscript()时,它会正确地显示添加的课程

但是,当我调用University对象上的printRegistrator()时,它表明student没有课程

这似乎我缺少了一个基本的OOP原则。我做错了什么?我如何让它工作

(我已经有了使用学生ID作为句柄在对象之间引用学生的方法,但如果我能让它工作的话,我认为这种方法看起来更优雅。)

完整代码如下:

此表达式的结果实际上是对内部
Student
对象的引用

Student Bob = UHD.addStudent("Bob");
但是,在这里,您是从该引用复制来构造对象
Bob
。如果要继续保留引用,需要将
Bob
作为引用:

Student& Bob = UHD.addStudent("Bob");
但是,请注意,
Bob
可能不会长期保持有效的引用。最多可以期望它持续到
UHD
对象出现,但是添加新的学生可能会导致向量重新分配其元素,在这种情况下,引用不再引用有效的对象。正如@tenfour在评论中所建议的那样,
std::list
可以避免这个问题,因为它不会重新分配元素。但是,我建议泄漏对内部对象的引用无论如何都是一种不好的方法,相反,我建议使用一种方法,通过
University
接口(可能只是一个简单的setter)修改内部
Student
对象


此调用触发复制构造函数,因此返回“Bob”的副本,但不返回添加到UHD的实际对象

长时间保存此引用也是不安全的;我认为
列表
是一个更好的选择,因此参考永远不会出现moves@tenfour是 啊事实上,他们可能已经有了这个问题,因为他们在添加了一个他们保留引用的学生之后,又添加了另一个
学生。令人惊叹的。谢谢。:)
Student Bob = UHD.addStudent("Bob");
Student& Bob = UHD.addStudent("Bob");
Student Bob = UHD.addStudent("Bob");