Как изменить значение члена структуры объекта?(C ++ struct начинающий) - PullRequest
2 голосов
/ 22 ноября 2011

Я только начал узнавать о структурах, я подумал, что понял, как они работают, используя оператор точки для доступа к элементу объекта, но я явно не понимаю, как функция readEmployeeRecord , приведенная ниже, неработать на всех.Как я должен это делать?(код короткий и самообъяснимый)

Большое спасибо, что нашли время для дальнейшего объяснения мне структур!Естественно, я сначала попробовал Google, но я не смог найти пример, который вводил данные именно так, как я хотел, и не знал, как мне поступить.

#include <iostream>
#include <iomanip>

using namespace std;

//Employee type
struct Employee{
    float wage;
    char status;
    char dept[4]; //for 3letter department, last position is \0 correct?
};

//function definitions
void readEmpoyeeRecord(Employee staff);
void printEmployeeRecord(Employee staff);

int main(){

    Employee employeeA;
    readEmpoyeeRecord(employeeA);
    printEmployeeRecord(employeeA);
    return 0;
}
void readEmpoyeeRecord(Employee employee){
    cout << "Enter empolyees wage: ";
    cin >> employee.wage;
    cout << "Enter empolyees status (H or S): ";
    cin >> employee.status;
    cout << "Enter empolyees dept (ABC): ";
    cin >> employee.dept;
}
void printEmployeeRecord(Employee staff){
    cout << "Wage:     Status:     Department:" <<endl;
    cout << fixed << setprecision( 2 ) << staff.wage;
}

Ответы [ 3 ]

9 голосов
/ 22 ноября 2011

Сначала попробуйте поискать в Google "передача параметров по ссылке и по значению".

Вы узнаете, что:

void readEmpoyeeRecord(Employee staff);

передает вашу переменную в функцию по значению, что означает, что копия вашего объекта создается и используется внутри функции, поэтому ваш исходный объект не изменяется, а копируется.

Чтобы получить желаемый результат, используйте:

void readEmpoyeeRecord(Employee& staff);

Передача по ссылке означает, что вы передаете тот же объект, а не копию.

Ваш код будет в основном работать так:

//create new employee
Employee employeeA;
//call method readEmployeeRecord on a copy of employeeA
readEmpoyeeRecord(employeeA);
//call method printEmployeeRecord on a copy of employeeA
printEmployeeRecord(employeeA);
3 голосов
/ 22 ноября 2011

readEmpoyeeRecord(Employee employee) является копией по значению, а не ссылкой, поэтому вы теряете свои изменения.

Используйте readEmpoyeeRecord(Employee& employee) вместо.

2 голосов
/ 22 ноября 2011

Ваша проблема в том, что в C ++ объекты передаются по значению, пока вы не укажете иначе. Таким образом, в теле readEmpoyeeRecord вы имеете дело с копией employeeA, а не с employeeA.

Передайте ссылку на вашу readEmpoyeeRecord функцию. Подпись readEmpoyeeRecord должна гласить:

void readEmpoyeeRecord(Employee &employee)
...