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

时间:2019-02-17 21:39:49

标签: c++ pointers data-structures parameters parameter-passing

我正在尝试将指向数据结构成员的指针传递给函数。我正在传递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;
}

2 个答案:

答案 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));

删除编译器错误。

但是,最好改变策略。

  1. 定义operator>>函数的重载以从流中读取对象的数据。这更惯用了。
  2. 从功能中删除提示。在调用operator>>函数之前,请提供所有提示信息。
  3. 使用以下调用来读取数据,这是我重复一遍的习惯。

    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;
}