Почему мои элементы в моем векторе объектов не обновляются при вызове одной из функций-членов объектов? - PullRequest
0 голосов
/ 05 октября 2018

Я долго пытался отлаживать это с помощью отладчика Visual Studio, но не могу понять, почему моя функция emp.setHoursWorked(hWorked); в recordHoursWorkedForEmployee только обновляется numOfHoursWorked, а в recordHoursWorkedForEmployee,как только программа выходит из функции, numOfHoursWorked всех сотрудников в векторе возвращается к 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;
}

1 Ответ

0 голосов
/ 05 октября 2018

Эта строка создает копию каждого сотрудника:

for (Employee emp : companyEmployees)

Переменная emp является копией объекта в контейнере.Так что если вы обновляете это, вы только обновляете копию.На каждой итерации вы получаете новое значение, скопированное в emp, но любые изменения не отражаются в исходном объекте.

Возможно, вы имели в виду:

for (Employee& emp : companyEmployees)
            ^^^

Здесь emp является ссылкой наобъект внутри вектора.Если вы изменяете это, вы изменяете исходное значение внутри вектора.

...