2017-10-19 67 views
0

嗨我正在为一所学校的项目工作,不能为我的生活弄清楚如何让totalJobCost函数工作。其他职能的工作没有问题,但我不认为他们是路过的VAR回到主为totalJobCost抢的totalJobCost输出0。这里是我使用的代码:Paint Job Estimator C++

#include "stdafx.h" 
#include <iostream> 

using namespace std; 

void space(double paintarea, double paintcost, double paintneeded, double totalpaint); 
void cost(double hrs, double hrcost, double spacetopaint); 
void totalJobCost(double allTheirPaintCost, double allTheirWages, double theirTotalJobCost); 


const double AREA_FORMULA = 220.00; 
const double AREAFORMULA_PAINT = 1.00; 
const double AREAFORMULA_HOURS = 8.00; 
const double AREAFORMULAHOURS_WAGES = 35.00; 

int main() 
{ 
    double areaTP; 
    double paintCST = 0; 
    double paintNeeded = 0; 
    double allPaintCost = 0; 
    double hoursNeeded = 0; 
    double hoursWages = 0; 
    double allWages = 0; 
    double allJobCost = 0; 

    cout << "Enter the square footage you need to paint, then press enter" << endl; 
    cin >> areaTP; 

    cout << "Enter the price by gallons of paint you will use, then press enter" << endl; 


    cin >> paintCST; 
    while (paintCST < 10) 
    { 
     cout << "Enter the price by gallons of paint you will use, then press enter. cannot be less than 10 :"; 
     cin >> paintCST; 
    } 

    space(areaTP, paintCST, paintNeeded, allPaintCost); 

    cost(hoursNeeded, hoursWages, areaTP); 


    totalJobCost(allPaintCost, hoursWages, allJobCost); 


    system("Pause"); 

    return 0; 
} 

void space(double paintarea, double paintcost, double paintneeded, double totalpaint) 
{ 

    paintneeded = paintarea/AREA_FORMULA * AREAFORMULA_PAINT; 
    totalpaint = paintneeded * paintcost; 

    cout << "How many gallons of paint you will need: " << paintneeded << endl; 
    cout << "Your total paint cost will be: " << totalpaint << endl; 
} 

void cost(double hrs, double hrcost, double spacetopaint) 
{ 

    hrs = (spacetopaint/AREA_FORMULA) * AREAFORMULA_HOURS; 
    hrcost = hrs * AREAFORMULAHOURS_WAGES; 

    cout << "The number of hours for the job will be: " << hrs << endl; 
    cout << "The total amount of wages will be: " << hrcost << endl; 

} 

void totalJobCost(double totalpaint, double hrcost, double theirTotalJobCost) 
{       
    theirTotalJobCost = totalpaint + hrcost; 

    cout << "The total price of your paint job will be: " << theirTotalJobCost << endl; 
} 

回答

1

您需要声明您的论点(totalpainthrcost)作为参考。

当前,函数space()cost()只是在调用时复制totalpainthrcost,更新它们,然后打印它们。但是当函数返回时,存储在totalpainthrcost中的值将丢失。

为了解决这个问题,你应该声明如下这些功能:

void space(double paintarea, double paintcost, double paintneeded, double& totalpaint) 

void cost(double hrs, double& hrcost, double spacetopaint) 

space()cost()它运行现在无论你的变量传递中作为totalpainthrcost将被更新。

+1

谢谢你的工作,但可以请你解释双重和作品?它只是说改变这个值无处不在,或者只是改变它运行的函数中的值(即:主) –

+0

它是后者:函数'space()',例如,只会改变'allPaintCost'的值在函数运行在('main()')中。 – frslm

+0

double&只是我下面给出的代码示例的简写,因为它很常见。它增加了一些安全功能,如不允许重新分配指针。 –

1

这是一个通过价值与通过引用问题。

在C++中,布尔值,字符,整数,浮点数, 阵列,类,包括字符串,列表,字典,套,堆栈, 队列-和枚举是值类型,而引用和指针 是参考类型。

CPP reference

您正在使用的变量是双打(双精度浮点),所以它们是值类型。当您将值类型变量作为参数传递给函数时,变量的当前值将被复制到您调用的函数的调用堆栈中。一旦进入函数,参数名称就是您用来访问复制值的名称。不管你对这些复制的值做什么都不会影响你传递给函数的原始变量的值。更多地了解C/C++的函数范围和调用堆栈体系结构。

要通过函数调用更改变量的值,需要将引用传递到其在内存中的位置。如果在函数的前几行声明一个变量,则它在内存中的位置将成为该函数调用堆栈的一部分,并且您可以在原始函数内调用的任何函数调用中安全地访问该内存。所以你可以这样做:

int main() { 
    double variable = 0; 
    function(&variable); 
    cout << variable; 
} 

void function(double* variable_address) { 
    *variable_address = 1.5; 
} 

这涉及到解引用操作符。对不起,如果这是太多的信息,但如果你知道C/C++的底层函数调用和内存体系结构中发生了什么,通过引用传递和通过值传递更容易理解。

+0

谢谢,这帮助我更多地理解函数的变量。 –