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

问题描述 投票:0回答:1

我正在为我的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
}

我尝试过在其他地方在线查找,但仍然感到头晕目眩。我该如何解决?

c++ arrays
1个回答
0
投票

我对此代码有几点评论。这段代码使用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;
}
© www.soinside.com 2019 - 2024. All rights reserved.