2013-10-26 61 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); 
相關問題