“double”类型的参数与“double *”类型的参数不兼容

问题描述 投票:-1回答:2

我试图将指向数据结构成员的指针传递给函数。我正在传递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;
}
c++ pointers data-structures parameters parameter-passing
2个回答
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);

现在这样说,我建议在这种情况下也将q​​azxswpoi更改为string*以避免不必要的手动内存管理。在这类课程中你真的不需要指针。在这种情况下,您将不得不使用string作为所有参数。

更好的是:不仅要删除EmployeeRecord中的指针,还要考虑通过引用传递参数:

&

1
投票

编译器的错误非常清楚。当参数类型为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

删除编译器错误。

但是,改变策略更好。

  1. 定义InputEmployeeData(&(ptr->LastName), &(ptr->FirstName), &(ptr->HrsWrkd), &(ptr->PayRate)); 函数的重载以从流中读取对象的数据。这更具惯用性。
  2. 从功能中删除提示。在调用operator>>函数之前提供任何提示信息。
  3. 使用以下调用来读取数据,即重复自己,更加惯用。 operator>>

EmployeeRecord employee;
cin >> employee;
© www.soinside.com 2019 - 2024. All rights reserved.