Вектор ссылок С++

107
25 августа 2019, 15:00

Изучаю классы в 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();
    }
}

Проблема в добавлении элементов в вектор. Элементы вроде как копируются в вектор, а значит при их изменении в векторе сами они не меняются.

Хотел реализовать с помощью добавления в вектор ссылок на эти элементы, но что-то не получилось. Как реализовать это?

Answer 1

Разумеется ваш вектор не меняется. У вас во все функции (updateAge и hello) передаются копии вектора и работа идет с копиями. Передавайте ссылки или указатели на векторы, если вы хотите менять сами оригинальные векторы, а не их копии.

Если же вы хотите, чтобы через вектор менялись ваши оригинальные объекты secPeople и people, то это совсем другое дело. В такой ситуации вам нужен вектор ссылок или указателей. Вектор ссылок можно создать путем указания std::reference_wrapper<People> в качестве типа элемента.

Answer 2

Поместить в вектор ссылки не получится. Используй вместо них указатели.

Answer 3

@Василий Пупкин а вы пробовали так писать ?

// Обновление возраста(age) у каждого элемента класса People
void updateAge(vector<People>& vec)
{ 
    for (int i = 0; i < vec.size(); ++i) {
        vec[i].updateAge();
    }
}
READ ALSO
Как хранить служебную информацию в табе?

Как хранить служебную информацию в табе?

Я создаю в QTabWidget динамические табы, в котором есть динамически созданные QLabel-ыУ каждого QLabel есть свой номер

108
C++ контейнеры map и set

C++ контейнеры map и set

Расжуйте пожалуйста эти строки:

119
Гетеры и сеттеры C++

Гетеры и сеттеры C++

Можете объяснить, как более правильно написать геттер для этого класса?

107
Невозможность асинхронного вызова recvfrom()

Невозможность асинхронного вызова recvfrom()

Вызов recvfrom() из вызванной асинхронно функции блокирует не только нить, в которой функция, но и вызывавший поток (возврат в него не происходит)Почему...

119