【问题标题】:Overloading error in C++ [Pass by Value and Pass by Reference]C++ 中的重载错误 [按值传递和按引用传递]
【发布时间】:2015-05-21 18:54:01
【问题描述】:

我正在做一个项目,该项目使用超载计算两种类型的员工(受薪和小时)的收入。这个项目有 3 个文件,这里是主要来源:

#include <iostream>
#include "Grosspay.h"
using namespace std;

void Grosspay::determineGrosspay()
{
    cout << "Enter 1 - Calculate payroll for hourly employee" << endl;
    cout << "Enter 2 - Calculate payroll for salary employee" << endl;
    cout << "Enter 3 - Exit" << endl;

    cout << "Federal Tax is 10% of Grosspay" << endl;
    cout << "State Tax is 5% of Grosspay" << endl;
    while (choice != 3)
    {
        cout << "\nEnter your choice: " << endl;
        cin >> choice;
        switch (choice)
        {
        case 1:
            cout << "Enter employee ID: " << endl;
            cin >> ID;
            cout << "Enter hours: " << endl;
            cin >> hours;
            cout << "Enter payrate: " << endl;
            cin >> payrate;

            cout << "Employee ID: %d" << ID << endl;
            cout << "The net pay for hourly employee: %.2f\n" << income(hours, payrate) << endl;
            break;
        case 2:
            cout << "Enter employee ID: " << endl;
            cin >> ID;
            cout << "Enter salary: " << endl;
            cin >> year;

            cout << "The net pay for salaried employee: %.2f\n" << income(year) << endl;
            break;
        case 3:
            cout << "Exited program" << endl;
            break;
        default:
            cout << "Please try again!" << endl;
            break;
        }
    }
}
double income(double hours, double payrate)
{
    double grosspay = 0;
    double federaltax = .10;
    double statetax = .05;
    double totaltax;
    double netpay;
    if (hours <= 40)
    {
        grosspay = payrate * hours;
    }if (hours > 40 && hours <= 50)
    {
        grosspay = (payrate * 40) + ((hours - 40) * payrate * 1.5);
    }
    if (hours > 50)
    {
        grosspay = (payrate * 40) + (10 * payrate * 1.5) + ((hours - 50) * payrate * 2);
    }
    cout << "Grosspay weekly is %.2f\n" << grosspay << endl;

    federaltax = grosspay * .10;
    cout << "Federal Tax is: %.2f\n" << federaltax << endl;

    statetax = grosspay * .05;
    cout << "State Tax is: %.2f\n" << statetax << endl;

    totaltax = federaltax + statetax;
    cout << "Total tax is: %.2f\n" << totaltax << endl;

    netpay = grosspay - totaltax;
    return (netpay);

}
double income(double year)
{
    double grosspay;
    double federaltax = .10;
    double statetax = .05;
    double totaltax;
    double netpay;

    grosspay = year / 52;
    cout << "Grosspay weekly is %.2f\n" << grosspay << endl;

    federaltax = grosspay * .10;
    cout << "Federal Tax is: %.2f\n" << federaltax << endl;

    statetax = grosspay * .05;
    cout << "State Tax is: %.2f\n" << statetax << endl;

    totaltax = federaltax + statetax;
    cout << "Total Tax is: %.2f\n" << totaltax << endl;

    netpay = grosspay - totaltax;
    return (netpay);
}

我不知道为什么程序找不到收入 来自

cout << "The net pay for hourly employee: %.2f\n" << income(hours, payrate) << endl;
cout << "The net pay for salaried employee: %.2f\n" << income(year) << endl;

另外,我需要使用程序中的至少一个函数来演示传值;并且至少是使用引用参数演示通过引用传递的函数之一。我不知道如何把它放在源代码中。有人帮忙吗?

【问题讨论】:

    标签: c++ overloading pass-by-reference pass-by-value


    【解决方案1】:

    由于income 函数未在Grosspay 类中定义,因此应在调用它们之前对其进行定义。尝试在 determineGrosspay 方法之前移动 income 的定义。

    另一种解决方案是使用function prototype,方法是将原型移动到determineGrosspay 函数“之前”,然后再执行它。


    由于您在 cmets 中询问了按引用传递和按值传递,因此我将其包含在此答案中。您为income 函数编写的内容是按值传递。这意味着将变量的副本传递给函数。

    通过引用传递意味着您将变量的引用传递给函数而不是它的副本。引用传递假定您的应用程序具有以下函数签名:income(const double &amp;year) 如果您不想修改函数中的年份变量,income(double &amp;year) 如果您想修改 year 的值。


    在您的应用程序中使用double income(const double &amp;year)

    请研究一下这是什么意思,因为它是语言的重要组成部分。

    【讨论】:

    • 这实际上解决了我的问题。非常感谢。你有什么想法如何为这个项目做传值和传引用吗?
    • 我真的很理解你所说的通过引用传递。对不起,因为我是初学者。我应该怎么做才能将其中一个函数更改为通过引用传递? double income(double&amp; year)
    • double income(const double &amp;year) 这就是我必须从我的代码中更改的全部内容吗?我必须更改函数内部的任何内容吗?因为在书中的例子中,似乎比这更难!
    • 我查看了您的代码,看起来这就是您需要更改的全部内容。函数中的任何内容都不需要更改。用我的函数签名编译它,并确保你得到相同的结果。
    • 好的,非常感谢!你真的很好,解释得很仔细。
    猜你喜欢
    • 2023-03-07
    • 2012-07-29
    • 1970-01-01
    • 1970-01-01
    • 2014-08-23
    • 2015-05-23
    • 2013-12-02
    • 2023-03-02
    • 2011-05-29
    相关资源
    最近更新 更多