*类型的参数与*类型的参数不兼容

时间:2020-04-01 23:05:32

标签: c++ arrays

我正在为“ Programming I”类开发一个项目,但遇到一个奇怪的错误。这是一个计薪程序,可计算税收和不计税,我们的教授希望我们将某些功能放在单独的.cpp文件中。

我已经对其进行了设置,以便将每个员工都视为一个结构:

#include <string>    
using namespace std;

struct Employee {
    string firstName;
    string lastName;
    string name;
    double rate;
    double hours;
    char status;
    double grossPay;
    double insurance;
    double socialSecurity;
    double stateTax;
    double federalTax;
    double PYE;
    double netPay;
};

在我的主程序中,我有一个由七个员工组成的数组:“员工”,并从一个单独的文本文件中对其进行初始化,但是当我尝试将该数组传递给单独的.cpp中的函数之一时,文件,出现此错误:

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

问题是,尽管这仅发生在三个函数中的前两个函数上,而第三个函数即使在注释掉前两个函数时也可以:

int main() {
    const int numEmployees = 7;
    Employee employees[numEmployees];

    cout << "name" << setw(20) << right << "rate" << setw(8) << "hours" << setw(7) << "ins" << setw(7) << "soc" << setw(7) << "state" << setw(7) << "fed" << setw(7) << "net" << endl
         << setw(46) << "sec" << setw(6) << "tax" << setw(8) << "tax" << endl;

    fstream data("employees.txt");

    for (int i = 0; i < numEmployees; i++) {
        data >> employees[i].firstName >> employees[i].lastName >> employees[i].rate >> employees[i].hours >> employees[i].status;

        employees[i].name = employees[i].firstName + " " + employees[i].lastName;
    }

    computeGrossPay(employees, numEmployees);   //<-\
    computeInsurance(employees, numEmployees);  //<- these two are errors
    computeFederalTax(employees, numEmployees); //<-- this one is fine

    for (int i = 0; i < numEmployees; i++) {
        // compute social security withheld as 7%  of gross pay
        employees[i].socialSecurity = employees[i].grossPay * 0.07;

        // compute state tax as 3% of gross pay
        employees[i].stateTax = employees[i].grossPay * 0.03;

        // Compute PYE (Projected Yearly earnings) as gross-pay times 52.
        employees[i].PYE = employees[i].grossPay * 52;

        // Compute Net pay as gross-pay  minus  insurance  minus  soc-sec minus state-tax minus fed-tax
        employees[i].netPay = employees[i].grossPay - employees[i].insurance - employees[i].socialSecurity - employees[i].stateTax - employees[i].federalTax;
    }

    printPayroll(employees, numEmployees);
}

以下是每个函数的外观,每个函数都位于各自独立的文件中:

void computeGrossPay(Employee* employees, int numEmployees) {
    // do stuff
}
void computeInsurance(Employee* employees, int numEmployees) {
    // do stuff
}
void computeFederalTax(Employee* employees, int numEmployees) {
    // do stuff
}

我该如何解决?

编辑:我相信这可能是我的IDE的问题。我使用的是Visual Studio,正如其他用户指出的那样,它在其他地方可以正常编译。我认为我会坚持使用基本的文本编辑器,直到准备好使用更高级的IDE。

1 个答案:

答案 0 :(得分:-1)

我对这段代码有几点评论。这段代码使用C样式的数组,并将其作为指针和指针大小传递,这是不明智的。而且,它没有使用C ++的一些最基本的概念。

我进行了一些重新排列-大部分都是将Employee变成具有自己的成员函数的真实结构/类,而不是从外部传递它。使用std :: array(比原始数组更可取)制作数组,最后,稍作触摸-将雇员人数设为constexpr

我没有安排输入解析,但是实际上,Employee需要是一个 class ,它不允许从外部接触其成员的值,并且应该具有一个构造函数,该构造函数可以获取所有相关的输入,而不是现在要做的事情。

看一下重新排列的代码:

using namespace std; // I strongly suggest against it!!!!

struct Employee {
    string firstName;
    string lastName;
    string name;
    double rate;
    double hours;
    char status;
    double grossPay;
    double insurance;
    double socialSecurity;
    double stateTax;
    double federalTax;
    double PYE;
    double netPay;

    void computeAll() // a bad name, but I don't have a better idea now!
    {
        computeGrossPay();
        computeInsurance();
        computeFederalTax();
        computeSocialSecurity();
        computeStateTax();
        computePYE();
        computeNetPay();
    }

private:
    void computeGrossPay();
    void computeInsurance();
    void computeFederalTax();
    void computeSocialSecurity();
    void computeStateTax();
    void computePYE();
    void computeNetPay();
};

int main() {
    constexpr uint64_t NUM_OF_EMPLOYEES = 7;
    std::array<Employee, NUM_OF_EMPLOYEES> employees{};

    cout << "name" << setw(20) << right << "rate" << setw(8) << "hours" << setw(7) << "ins" << setw(7) << "soc" << setw(7) << "state" << setw(7) << "fed" << setw(7) << "net" << endl
         << setw(46) << "sec" << setw(6) << "tax" << setw(8) << "tax" << endl;

    fstream data("employees.txt");

    for (auto& employee : employees) 
    {
        data >> employee.firstName >> employee.lastName >> employee.rate >> employee.hours >> employee.status;

        employee.name = employee.firstName + " " + employee.lastName;

        employee.computeAll();
    }

    return 0;
}
相关问题