2013-10-26 66 views
7

我是C++新手,所以请原谅noob问题。在我的程序中,我通过引用将一个“Employee”对象向量传递给一个函数,这个函数在向量中的每个对象上调用一个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

好吧,我怀疑一个简单的解决。制作“员工”的本地副本当然是个问题。我希望我可以将多个答案标记为已接受......但你们都得到了赞扬。谢谢!!! –

回答

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); 
相关问题