2013-10-26 2 views
7

Я новичок в C++, поэтому, пожалуйста, простите вопрос о noob. В моей программе я передаю вектор объектов «Сотрудник» в функцию по ссылке, которая вызывает функцию члена Employee для каждого объекта в векторе, чтобы повысить «зарплату» на «r» процентов (в данном случае 2 процента). Я проверил, что это происходит путем регистрации звонка (зарплата изменяется внутри функции), но изменения не сохраняются ... когда я снова печатаю объекты Employee, зарплаты остаются неизменными. Цените любую помощь!Передача вектора по ссылке на функцию, но изменение не сохраняется

// main.cpp 
void raiseAllBy2Percent(vector<Employee> &v) 
{ 
for (int i = 0; i < v.size(); i++) 
    { 
    Employee e = v[i]; 
    e.salaryRaise(2); 
    } 
} 

// Employee.cpp 
void Employee::salaryRaise(double r) 
{ 
cout << "**salaryRaise called"; 
_salary += (r/100 * _salary); 
cout << "**new salary: " << _salary; // This logs with the change as expected 
} 
+0

Хорошо, как я подозревал, простое исправление. Естественно, создание локальной копии «Сотрудника» было проблемой. Хотел бы я отметить несколько ответов, как принято ... но вы все получили upvotes. Благодаря!!! –

ответ

11

Вы передаете вектор по ссылке, но в этой строке:

Employee e = v[i]; 

Вы находитесь копирование объект сотрудника. Сделайте это также ссылкой:

Employee &e = v[i]; 

и он будет вести себя так, как ожидалось.

(Обратите внимание, что это работает только потому, что std::vector::operator[] сами возвращает ссылку, так как оператор индексирования большинства стандартных контейнеров делает.)

3

Вы не изменяете векторный контент. Вместо того, чтобы присвоить его другому новому Employee объекта, e и изменить что:

Employee e = v[i]; 
e.salaryRaise(2); 

Изменить это:

v[i].salaryRaise(2); 

Это будет изменять элементы в векторе.

1

Вы делаете копию элементов в векторе здесь:

Employee e = v[i]; // e is a copy of v[i] 

Вы, вероятно, означает

v[i].salaryRaise(2); 
Смежные вопросы