Вектор мутатора странного поведения C++

Я работаю над работой для школы, где нам нужно создать класс Client с 4 строками, 4 int и вектором (int) в качестве последнего аргумента. Проблема в том, что когда я хочу напечатать все элементы вектора, если я использую свой мутатор напрямую, он печатает чепуху.

vector<int> v_int;
vector<int>::iterator it_v_i;
v_int.push_back(2);
v_int.push_back(3);
v_int.push_back(7);
v_int.push_back(1);

Client client("nom1", "prenom1", "adress1", "city1", "comment1", 1240967102, 44522, 5, 10, v_int);

v_int = client.getIdResources();
for (it_v_i = v_int.begin(); it_v_i != v_int.end(); it_v_i++) {
    cout << *it_v_i << ", ";
}

напечатайте 2,3,7,1 как и ожидалось, но следующий код

for (it_v_i = client.getIdResources().begin(); it_v_i != client.getIdResources().end(); it_v_i++) {
    cout << *it_v_i << ", ";
}

вывести неопознанный номер (например, 3417664...), неопознанный номер, 7, 1

Я действительно не понимаю, почему это происходит

ИЗМЕНИТЬ:

Конструктор:

Client::Client(const string& name, const string& surname, const string& adress, const string& city, const string& comment,
            const int& phoneNb, const int& postalCode, const int& termAppointment, const int& priority, const vector<int>& idResources)
                : name(name), surname(surname), adress(adress), city(city), comment(comment), phoneNumber(phoneNb),
                postalCode(postalCode), termAppointment(termAppointment), priority(priority), idResources(idResources)

{ }

Мутатор:

std::vector<int> getIdResources() const{ return idResources; }

person DadEap Purple    schedule 06.03.2014    source источник


Ответы (1)


Проблема в том, что во втором фрагменте два временные vector используются для получения итераторов begin() и end() (при условии, что объявление std::vector<int> client.getIdResources(), а не std::vector<int>& client.getIdResources()). Это означает, что it_v_i относится к элементам разрушенного std::vector. Когда it_v_i разыменовывается, это вызывает неопределенное поведение.

Чтобы второй фрагмент кода работал правильно, ссылка на std::vector должна быть возвращена client.getIdResources(). Однако возврат ссылок на внутренние члены класса приводит к другим проблемам, таким как проблемы с продолжительностью жизни.

person hmjd    schedule 06.03.2014
comment
Так это означает, что 1-й случай - единственный способ сделать это правильно? - person DadEap Purple; 06.03.2014
comment
@DadEapPurple, да, или измените getIdResources(), чтобы вернуть const std::vector<int>&. - person hmjd; 06.03.2014