Изучаю классы в C++. В следующем коде я хочу реализовать общую функцию updateAge(), которая у каждого элемента класса People (т.е. добавленного в вектор) вызывает одноимённую функцию класса updateAge, которая увеличивает у всех возраст на 1.
В общем, хотел добавить эти элементы в вектор для работы с ними с помощью цикла.
#include <pch.h>
#include <iostream>
#include <string>
#include <vector>
using namespace std;
class People {
public:
string name;
int age;
People(string fName = "Noname", int fAge = 0) {
name = fName;
age = fAge;
}
void updateAge() {
age++;
}
void hello() {
cout << "Hello, my name is " << name << " and I am " << age << " years old!" << endl << endl;
}
};
// Прототипы функций
void updateAge(vector<People> vec);
void hello(vector<People> vec);
int main() {
int year = 0;
People people("Maxim", 28);
people.hello();
People &rPeople = people;
People secPeople;
secPeople.hello();
People &rSecPeople = secPeople;
vector<People> vec;
vec.push_back(rPeople);
vec.push_back(rSecPeople);
year++; // Год проходит и возраст всех People увеличивается :>
updateAge(vec);
hello(vec);
return 0;
}
void updateAge(vector<People> vec) { // Обновление возраста(age) у каждого элемента класса People
for (int i = 0; i < vec.size(); i++) {
vec[i].updateAge();
}
}
void hello(vector<People> vec) { // Выполнение у всех элементов класса People функции hello()
for (int i = 0; i < vec.size(); i++) {
vec[i].hello();
}
}
Проблема в добавлении элементов в вектор. Элементы вроде как копируются в вектор, а значит при их изменении в векторе сами они не меняются.
Хотел реализовать с помощью добавления в вектор ссылок на эти элементы, но что-то не получилось. Как реализовать это?
Разумеется ваш вектор не меняется. У вас во все функции (updateAge
и hello
) передаются копии вектора и работа идет с копиями. Передавайте ссылки или указатели на векторы, если вы хотите менять сами оригинальные векторы, а не их копии.
Если же вы хотите, чтобы через вектор менялись ваши оригинальные объекты secPeople
и people
, то это совсем другое дело. В такой ситуации вам нужен вектор ссылок или указателей. Вектор ссылок можно создать путем указания std::reference_wrapper<People>
в качестве типа элемента.
Поместить в вектор ссылки не получится. Используй вместо них указатели.
@Василий Пупкин а вы пробовали так писать ?
// Обновление возраста(age) у каждого элемента класса People
void updateAge(vector<People>& vec)
{
for (int i = 0; i < vec.size(); ++i) {
vec[i].updateAge();
}
}
Виртуальный выделенный сервер (VDS) становится отличным выбором
Я создаю в QTabWidget динамические табы, в котором есть динамически созданные QLabel-ыУ каждого QLabel есть свой номер
Вызов recvfrom() из вызванной асинхронно функции блокирует не только нить, в которой функция, но и вызывавший поток (возврат в него не происходит)Почему...