我试图将指向数据结构成员的指针传递给函数。我正在传递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;
}
缺少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);
现在这样说,我建议在这种情况下也将qazxswpoi更改为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
...
}
时,不得在调用函数时使用double*
对象。
您可以更改对该功能的调用
double
删除编译器错误。
但是,改变策略更好。
InputEmployeeData(&(ptr->LastName), &(ptr->FirstName), &(ptr->HrsWrkd), &(ptr->PayRate));
函数的重载以从流中读取对象的数据。这更具惯用性。operator>>
函数之前提供任何提示信息。operator>>
EmployeeRecord employee;
cin >> employee;