C++OOP基础知识-是否正确返回对象引用



我正在学习C++,在处理作为引用返回的对象时遇到问题,我想继续使用和修改该对象。

我有两个班,大学和学生。

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

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

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

但是,当我在University对象上调用printRegistor()时,它表明该学生没有课程。

这似乎是我错过了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对象出现,但添加新的学生可能会导致向量重新分配其元素,在这种情况下,引用不再引用有效对象。正如@tenfour在评论中所建议的那样,std::list可以避免这个问题,因为它不会重新分配元素。然而,我建议,无论如何,泄露对内部对象的引用都是一种糟糕的做法,相反,我建议通过University接口修改内部Student对象(也许只是一个简单的setter)。

Student Bob = UHD.addStudent("Bob");

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

最新更新