我正在学习 C++,在处理作为引用返回的对象时遇到问题,我想继续使用和修改它。
我有两个类(class),大学和学生。
University 已实例化并具有方法 addStudent(),该方法将新的 Student 对象存储在 University 的私有(private) vector 数据成员中。我希望该方法返回对新创建的 Student 对象的引用。然后,我想调用 returend 对象上的 Student::addCourse() 方法,将一些类(class)添加到学生的“成绩单”。
我认为,由于我返回了对 Student 对象的引用,它会更新自身存储在 University 对象的 _Students vector 中,因此更改将在其范围之外可见,但它不会保留更改。
当我对返回的 Student 对象调用 printTranscript() 时,它会正确显示添加的类(class)。
但是,当我在大学对象上调用 printRegistrar() 时,它显示学生没有类(class)。
这似乎是我缺少基本的 OOP 原则。我做错了什么,我该如何让它发挥作用?
(我已经使用学生 ID 作为句柄在对象之间引用学生,但我认为这种方式看起来更优雅,如果我能让它工作的话。)
完整代码在这里:http://pastebin.com/cjmC1UuL
// Create a new university called UHD.
University UHD;
// Add 4 students to UHD.
UHD.addStudent("Jim");
UHD.addStudent("Bill");
Student Bob = UHD.addStudent("Bob");
UHD.addStudent("Greg");
// Add 3 classes for Bob
Bob.addCourse("WRTG140");
Bob.addCourse("MATH009");
Bob.addCourse("BIOL101");
// Shows Bob correctly has 3 classes.
Bob.printTranscript();
// BUG?: Shows Bob incorrectly has 0 classes.
UHD.printRegistrar();
最佳答案
UHD.addStudent("Bob")
这个表达式的结果确实是对内部 Student
对象的引用。
Student Bob = UHD.addStudent("Bob");
然而,在这里,您正在从该引用中复制以构造对象 Bob
。如果你想继续保留引用,你需要让 Bob
成为引用:
Student& Bob = UHD.addStudent("Bob");
但是请注意,Bob
可能不会长期保持有效引用。您最多可以预期它会持续到 UHD
对象出现为止,但是添加新学生可能会导致 vector 重新分配其元素,在这种情况下,引用不再引用有效对象。正如@tenfour 在评论中建议的那样,std::list
可以避免该问题,因为它不会重新分配其元素。但是,我建议泄漏对内部对象的引用无论如何都是一种糟糕的做事方式,而是建议通过 University
修改内部 Student
对象> 接口(interface)(也许只是一个简单的 setter )。
关于C++ OOP 基础 - 正确返回对象引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22132098/