2011-11-22 32 views
2

刚开始了解结构,我想我明白他们是如何工作的,使用点运算符来访问对象中的一员,但我显然不为readEmployeeRecord以下功能不一切工作。我应该如何做到这一点? (代码是短期和自我explantory)如何更改结构对象的成员值? (C++初学者结构)

非常感谢您抽出宝贵时间来进一步解释结构给我!当然,我首先尝试谷歌,但我找不到一个例子,输入数据相当我想要的方式,并不知道我应该如何去做。

#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; 
} 
+1

你能描述你的意思通过“完全不工作?”发生了什么,你期望发生什么? –

回答

9

首先,尝试在谷歌搜索“通过引用和按值传递参数”。

你会了解到:

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); 
+0

当然哦!我曾经遇到过参照之前,但我本周有点慢了..谢谢! – Holly

2

你的问题是,在C++中,对象是按值,直至另行指定通过。因此,在readEmpoyeeRecord的身体,你正在处理的employeeA副本,不与employeeA本身。

传递给你的readEmpoyeeRecord函数的引用。的readEmpoyeeRecord签名改为:

void readEmpoyeeRecord(Employee &employee) 
3

readEmpoyeeRecord(Employee employee)是值复制,不引用,所以你正在失去你的变化。

使用readEmpoyeeRecord(Employee& employee)代替。