C++中调用vector内类对象的成员函数不生效问题求助
问题原因
核心差异是C++的值语义和Python的引用语义不同:
- 执行
all_institutions.push_back(school)时,vector会对传入的school对象做深拷贝,生成一个独立的副本存入容器内部。此时内存中存在两个完全独立的institution实例:- 栈上的原始
school对象 - 存储在
all_institutions容器内的拷贝对象
- 栈上的原始
- 你调用
all_institutions[0].add_student("somebody_name")修改的是容器内的拷贝,和原始school对象没有关联,所以遍历原始school的accepted_students时自然看不到添加的somebody_name。
解决方法
根据你的使用场景可以选择以下任意一种方案:
方案1:直接遍历容器内的对象
如果你最终要使用存储在all_institutions里的数据,直接遍历容器内的对象即可,可看到添加的所有内容:
// 替换你原有的遍历代码 for (int i = 0; i < all_institutions[0].accepted_students.size(); i++) { cout << all_institutions[0].accepted_students[i] << endl; }
运行上述代码会同时输出somebody_name。
方案2:容器存储指针,让多个变量指向同一实例
如果你需要同时通过原始变量和容器操作同一个对象,可以将vector改为存储对象指针:
// 修改全局vector定义 vector<institution*> all_institutions; int main() { institution school("school_name"); // 存入对象的地址,不会拷贝对象 all_institutions.push_back(&school); // 通过指针调用成员函数 all_institutions[0]->add_student("somebody_name"); school.add_student("my_name"); // 此时遍历原始school对象会输出两个名字 for (int i = 0; i < school.accepted_students.size(); i++) { cout << school.accepted_students[i] << endl; } return 0; }
方案3:直接在容器内构造对象,避免多余拷贝
如果你不需要单独维护原始school变量,可直接在vector中构造实例,后续所有操作都针对容器内的对象即可:
int main() { // 直接在容器内构造institution对象,无额外拷贝 all_institutions.emplace_back("school_name"); all_institutions[0].add_student("somebody_name"); all_institutions[0].add_student("my_name"); for (int i = 0; i < all_institutions[0].accepted_students.size(); i++) { cout << all_institutions[0].accepted_students[i] << endl; } return 0; }
内容的提问来源于stack exchange,提问作者omar alotaibi
相关产品推荐
相关产品推荐

