аргумент типа "double" несовместим с параметром типа "double *" - PullRequest
0 голосов
/ 18 февраля 2019

Я пытаюсь передать указатель на член структуры данных в функцию.Я передаю 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 голосов
/ 18 февраля 2019

Ошибка от компилятора очень понятна.Когда тип аргумента 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;
}
0 голосов
/ 18 февраля 2019

Определение 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
    ...
}
...