首页 > 解决方案 > 为什么我的对象向量中的元素在调用对象成员函数之一时没有更新?

问题描述

我一直在尝试使用 Visual Studio 调试器进行调试很长时间,但我无法弄清楚为什么我的函数emp.setHoursWorked(hWorked);inrecordHoursWorkedForEmployee似乎只numOfHoursWorked在 in中更新recordHoursWorkedForEmployee,一旦程序退出numOfHoursWorked向量中所有员工的函数 go回到 0。下面是有问题的代码。任何帮助,将不胜感激。

#ifndef PAYROLLSYSTEM   
#define PAYROLLSYSTEM
#include "Employee.h"
#include "Paycheck.h"
#include <string>
#include <vector>

using namespace std;

class PayRollSystem
{
public:

    //custom constructor gets company name
    PayRollSystem(string);
    void createEmployee(string, string,string, double);
    void removeEmployee(string);
    void recordHoursWorkedForEmployee(string);
    void issuePaychecks();


private:
    string companyName;
    vector<Employee> companyEmployees;
};
#endif



void PayRollSystem::createEmployee(string empId, string fName, string lName, double hWage)
{
    Employee temEmp = Employee(empId, fName, lName, hWage);
    companyEmployees.push_back(temEmp);

}


void PayRollSystem::recordHoursWorkedForEmployee(string empId)
{

    for (Employee emp : companyEmployees)
    {

        if (emp.getEmployeeId() == empId)
        {
            int hWorked = 0;
            cout << "What are the hours the worked for " + emp.getEmployeeId() + " during current pay period?" << endl;
            cin >> hWorked;

            //TODO: For some reason this line is not updating the hours worked. Must fix!
            emp.setHoursWorked(hWorked);
            cout << "Hours for " + emp.getEmployeeId() + " have been changed to " << emp.getHoursWorked() << endl;
        }
    }

}

我在这里排除了头文件,以免粘贴太多与我面临的问题无关的东西,只粘贴与提供的问题相关的成员函数的实现

//Overloaded constructor to be used with PayRollSystem
Employee::Employee(string empId, string fName, string lName, double hWage)
{
    employeeId = empId;
    firstName = fName;
    lastName = lName;
    hourlyWage = hWage;
    numOfHoursWorked = 0;

}

void Employee::setHoursWorked(int hWorked)
{
    if (hWorked >= 0)
        numOfHoursWorked = hWorked;
    else
    {
        cout << "Invalid number of hours worked." << endl;
        exit(EXIT_FAILURE);
    }
}

string Employee::getEmployeeId() const
{
    return employeeId;
}

标签: c++vectormember-functions

解决方案


此行复制每个员工:

for (Employee emp : companyEmployees)

该变量emp是容器中对象的副本。因此,如果您更新它,您只是在更新副本。每次迭代都会将新值复制到其中emp,但任何更改都不会反映在原始对象中。

你可能的意思是:

for (Employee& emp : companyEmployees)
            ^^^

emp是对向量内对象的引用。如果您修改它,您将修改向量内的原始值。


推荐阅读