Как изменить значение члена объекта структуры? (начинающий со структур С++)

Только начинаю изучать структуры, я думал, что понял, как они работают, используя оператор точки для доступа к члену объекта, но я явно не понимаю, так как функция 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;
}

person Holly    schedule 22.11.2011    source источник
comment
Можете ли вы описать, что вы подразумеваете под «совсем не работает»? Что происходит и чего вы ожидаете?   -  person Collin Dauphinee    schedule 22.11.2011


Ответы (3)


Во-первых, попробуйте поискать в 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);
person Luchian Grigore    schedule 22.11.2011
comment
Ох конечно! Раньше я сталкивался с передачей по ссылке, но на этой неделе я немного медлителен, ха .. Спасибо! - person Holly; 22.11.2011

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

Вместо этого используйте readEmpoyeeRecord(Employee& employee).

person Dan    schedule 22.11.2011

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

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

void readEmpoyeeRecord(Employee &employee)
person Antoine    schedule 22.11.2011