c++ - 更改对象向量的对象时,值会不断重置
问题描述
我创建了两个类。第一个类接受一个字符串作为参数,它设置为人名。
第二类是我创建一个包含对象的向量对象的地方。我需要这个对象稍后在代码中创建其他功能。(此代码是我的主要代码遇到的问题的一个示例)
在主要部分中,我创建了我尝试修改的人和人的对象。
修改代码后,它会恢复。
我已经尝试通过参考来获取所有内容,但它不起作用。我不确定我做错了什么。
创建对象的第一个类(这些将存储在向量中)
class person {
// Private
string name;
public:
// Constructor
person(const std::string& n) : name(n) {};
std::string getName() {
return name;
}
void setName(const std::string& n) {
name = n;
}
};
这是创建对象的类,它采用对象的向量。
class people {
// Private
vector<person> _peeps;
public:
// Constructor
people(const vector<person>& r) : _peeps(r) {};
vector<person> getRobots() {
return _peeps;
}
void addRobot(const person& r) {
_peeps.push_back(r);
}
};
这是代码的主要部分,我在其中创建对象并打印输出。
int main(){
string arr[5] = { "john", "eddison", "jeves", "elenour", "curtis"};
vector<person> rob;
for (auto x : arr) {
rob.push_back(person(x));
}
people robots = people(rob);
for (person &x : robots.getRobots()) {
cout << x.getName() << ", ";
}
cout << "\n2\n";
for (person &x : robots.getRobots()) {
x.setName(x.getName() + "x");
cout << x.getName() << ", ";
}
cout << "\n3\n";
for (person &x : robots.getRobots()) {
cout << x.getName() << ", ";
}
}
这是代码的输出
1(我输出对象向量内的所有值)
2(我编辑向量内的所有值)
3(测试以显示值是否已更改)
1
约翰, 爱迪生, 杰夫斯, 埃勒诺, 柯蒂斯,
2
johnx, eddisonx, jevesx, elenourx, curtisx,
3
约翰, 爱迪生, 杰夫斯, 埃勒诺, 柯蒂斯,
为什么 3 处的输出与 2 不同?
解决方案
您返回副本而不是参考,
利用
const std::vector<person>& getRobots() const { return _peeps; }
std::vector<person>& getRobots() { return _peeps; }
推荐阅读
- jenkins - 从 GitLab 管道阶段触发 Jenkins 作业并在成功完成作业后移至下一阶段
- queue - 对于生产者消费者问题,哪个是更好的 POSIX 消息队列或 PIPES
- java - 将 Windows 命名管道用于 IPC 的一种有效方法
- pytorch - 具有多个学习率的循环学习率
- gradle - 我没有代理,但 Gradle 说“连接到 127.0.0.1:8888 [/127.0.0.1] 失败”,即使在删除 ~/.gradle 之后也是如此
- node.js - 猫鼬错误对象在邮递员或 console.log() 中不显示名称
- python - 使用 xgboost 进行二进制分类,得到 10000x2 yhat
- javascript - 如何通过 Angular 在 JSON 文件中使用变量?
- c# - 通过 EF Core 连接到 ASP.NET Core 应用程序中的 SQL Server 时,管道的另一端没有进程
- typescript - ESlint 抱怨无用的构造函数