C++ OOP 基础 - 正确返回对象引用?

标签 c++ oop

我正在学习 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/

相关文章:

c++ - 如何在控制台应用程序的 mini2440 屏幕上打印我的应用程序的输出?

c++ - dll导入c++/MFC的编译器错误

java - 包私有(private)静态成员类与包私有(private)类

php - 为什么变量应该有 public 或 private 或 protect 但函数不应该在类中

c++ - UDP 服务器发送回复失败,sendto 返回 -1,errno 为 22

c++ - C/C++ 后递增/递减和函数调用

c++ - 如何在cuda上创建全局可访问的变量?

c++ - 这是将指向对象的指针分配给函数的正确方法吗?

javascript - 在 Javascript 中,如何在满足某些条件的情况下查找数组中具有最高值的特定属性的对象

java - 在不同类之间共享 HashMap 和其他一些数据结构