C++;OOP基础知识-正确返回对象引用? 我正在学习C++,并且有一个问题,它是作为一个引用返回的对象,我想继续使用和修改它。
我有两个班,大学和学生 University被实例化并具有addStudent()方法,该方法将新的Student对象存储在University的私有向量数据成员中。我希望该方法返回对新创建的Student对象的引用。然后我想调用returend对象上的Student::addCourse()方法,将一些课程添加到学生的“成绩单”中 我认为,由于我返回了一个对Student对象的引用,它将更新自身存储在University对象中的_Students向量中,因此这些更改将在其范围之外可见,但它不会保留这些更改 当我对返回的Student对象调用printTranscript()时,它会正确地显示添加的课程 但是,当我调用University对象上的printRegistrator()时,它表明student没有课程 这似乎我缺少了一个基本的OOP原则。我做错了什么?我如何让它工作 (我已经有了使用学生ID作为句柄在对象之间引用学生的方法,但如果我能让它工作的话,我认为这种方法看起来更优雅。) 完整代码如下: 此表达式的结果实际上是对内部C++;OOP基础知识-正确返回对象引用? 我正在学习C++,并且有一个问题,它是作为一个引用返回的对象,我想继续使用和修改它。,c++,oop,C++,Oop,我有两个班,大学和学生 University被实例化并具有addStudent()方法,该方法将新的Student对象存储在University的私有向量数据成员中。我希望该方法返回对新创建的Student对象的引用。然后我想调用returend对象上的Student::addCourse()方法,将一些课程添加到学生的“成绩单”中 我认为,由于我返回了一个对Student对象的引用,它将更新自身存储在University对象中的_Students向量中,因此这些更改将在其范围之外可见,但它不会
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");