我正在尝试将指向数据结构成员的指针传递给函数。我正在传递4变量,并且正在传递两个字符串成员,但是两个双精度成员不断给出此错误。我不明白为什么这会导致错误。
原型:
void InputEmployeeData(std::string *LastName, std::string *FirstName, double *HrsWrkd, double *PayRate);
我的主要功能:
int main()
{
EmployeeRecord *ptr, Employees;
ptr = &Employees;
InputEmployeeData(ptr->LastName, ptr->FirstName, ptr->HrsWrkd, ptr->PayRate);
}
功能:
void InputEmployeeData(std::string *LastName, std::string *FirstName, double *HrsWrkd, double *PayRate)
{
/*Input module that requests employee's first name, last name, hours worked, and pay*/
std::cout << "Enter employee's first name: ";
std::cin >> *FirstName;
std::cout << "Enter employee's last name: ";
std::cin >> *LastName;
std::cout << "Enter number of hours worked: ";
std::cin >> *HrsWrkd;
std::cout << "Enter hourly pay rate: ";
std::cin >> *PayRate;
}
答案 0 :(得分:2)
EmployeeRecord
的定义丢失了,但是根据您的代码,看来应该是这样的:
class EmployeeRecord {
...
public:
string *LastName; // all pointers ?
string *FirstName;
double *HrsWrkd;
double *PayRate;
...
};
但是,这需要一些手动内存管理,才能在存储某些值之前使用new
创建成员对象。真的是这样吗?
肯定不完全。因为根据错误消息-并假设string*
参数确实没有问题-您似乎有:
class EmployeeRecord {
...
public:
string *LastName;
string *FirstName;
double HrsWrkd; // no pointers, but values
double PayRate;
...
};
在这种情况下,您应该将呼叫更改为:
// note the use of & to get the pointer to the object
InputEmployeeData(ptr->LastName, ptr->FirstName, &ptr->HrsWrkd, &ptr->PayRate);
现在这么说,我建议在这种情况下也将string*
更改为string
以避免不必要的手动内存管理。在此类中,您真的不需要指针。在这种情况下,您必须对所有参数使用&
。
甚至更好:不仅摆脱EmployeeRecord中的指针,而且考虑通过引用传递参数:
void InputEmployeeData(std::string& LastName, std::string& FirstName, double& HrsWrkd, double& PayRate)
{
...
std::cin >> FirstName; // no use of pointer dereferencing * anymore
// the reference will make sure the original object
// passed by reference will be modified
...
}
答案 1 :(得分:1)
来自编译器的错误非常清楚。当参数的类型为double*
时,不得在函数调用中使用double
对象。
您可以将对函数的调用更改为
InputEmployeeData(&(ptr->LastName), &(ptr->FirstName), &(ptr->HrsWrkd), &(ptr->PayRate));
删除编译器错误。
但是,最好改变策略。
operator>>
函数的重载以从流中读取对象的数据。这更惯用了。operator>>
函数之前,请提供所有提示信息。使用以下调用来读取数据,这是我重复一遍的习惯。
EmployeeRecord employee;
cin >> employee;
class EmployeeRecord
{
...
friend std::istream operator>>(std::istream& in, EmployeeRecord& emp)
{
return (in >> emp.FirstName >> emp.LastName >> emp.HrsWrkd >> em.PayRate);
}
};
int main()
{
EmployeeRecord employee;
std::cout << "Enter employee's first name, last name, hours workd, and pay rate.\n";
std::cin >> employee;
}