Assigning a value to a variable

I posted a question earlier that ask what I was doing wrong in my programming. In short, several experts explained to me that I  can't name a function and a variable with the same syntax. Okay, I changed that. However, I am still not recieving the correct value. (This time I only posted fraction of the code that I have been experimenting with -if you need to see it all to understand pls advise)
Problem:
I have a funtion that is solving for a value. Then another funtion that calls that value to display it.  Why does it not display it? I tried to assign a value of  0 to the variable but that doesnt work. What should I be doing?

void Wages::netPay()                ///This my function that  calculates     do I need to aassign a value of 0 to this? If so where do I assign this?
      
{      float grossPay;
   
    grossPay = (wage-tax);
      
      cout<< grossPay<<endl;
}
void Wages::displayLine()
{
      cout << setw (12) << left  << name
            << setw (11) << right << hours
            << setw (8)  << right << classification
            << setw (11)  << right << rate
            << setw (7) <<"$" << right <<wage
            << setw (6) <<"$" << right <<tax
            << setw (9) <<"$" << right <<grossPay ; /////This is where it should dispaly.However, My answer is 0
      
      cout << endl;      
bananaamyAsked:
Who is Participating?
 
Hamed ZaghaghiConnect With a Mentor ProgrammerCommented:
just delete the `grossPay' local variable in netPay function, 'cuse in c++ local variable hide the global (like member variables), so if you define a local variable with the same name of a member variable or global variable you have tell the c++ which one to use:
1-if you have a member variable use `this' class pointer to access that member

2-if you have a global variable you can use the  global scope operator '::' to access the global variable

3-if you just type the name of that variable then compiler use the local one.

good luck.
0
 
SteHCommented:
You assing the value to a local variable. When Wages::netPay ends the value is lost.
Do you wanted to assign the value (wage-tax) to a member variable?

void Wages::netPay()
{
     // float grossPay This local will make the member variable invisible.
     grossPay = (wage-tax);
     cout<< grossPay<<endl;
}
0
 
SteHCommented:
Can you please post the definition of class Wages if this was not the solution.
0
The 14th Annual Expert Award Winners

The results are in! Meet the top members of our 2017 Expert Awards. Congratulations to all who qualified!

 
stefan73Commented:
Hi,

You've defined float grossPay in ::netPay as a local variable. Since you output grossPay in the line
          << setw (9) <<"$" << right <<grossPay ; /////This is where it should dispaly.However, My answer is 0

I assume that grossPay is also defined as a class member. In this case, the local variable has a higher priority.

In other words, the class variable is never modified.
Simply remove the float grossPay declaration in netPay().

In order to make the local/instance distiction clearer, you can also use "this" explicitly:
void Wages::netPay()                    
{    
   
    this -> grossPay = (wage-tax);
     cout<< (this -> grossPay)<<endl;
}

But that's not necessary.

0
 
bananaamyAuthor Commented:

#include <iostream>
#include <cstring>
#include <ctype.h>
#include <string>
#include <iomanip>


using namespace std;
class Wages
{
private:
      string name;
      float hours;
      char classification;
      float rate;
      float wage;
      float tax;
      char enterChar;
      float grossPay ;
      
      
      public:
      void getName();
      float values();
      float assignHourlyRate();
      void calWage();
      void assignTax();
      void netPay();
      void displayHeadings();
      void displayLine();

      
};

      int main ()
      {
      Wages theWages;
      while(true)
      {
            theWages.getName();
            theWages.values();
            theWages.assignHourlyRate();
            theWages.calWage();
            theWages.assignTax();
            theWages.netPay();
            theWages.displayHeadings();
            theWages.displayLine();
      }
}

void Wages::getName()
{            
      cout<<"Please enter the Employees name: ";
      cin >>  name ;
      cout<<setw (33) << right <<"You have entered:"<< name << endl;
      cout<<setw (33) << right << "Is this correct? ";
      cin >>enterChar ;
      if (enterChar == 'N'||enterChar == 'n')
      {
            cout<<"Please reenter the correct name: ";
            cin >> name;
      }
}


float Wages::values()

{cout << "Enter "<<name<<"'s " << "total hours worked"": ";
cin >> hours ;
return 0;
}
float Wages::assignHourlyRate()
{
      cout << "Enter classification: ";
      cin >> classification;
      classification = toupper(classification);
      while (classification != 'A' && classification != 'B' && classification != 'C' && classification != 'D')
      {
            cout << "Your choices are A, B, C,or D : ";
            cin >> classification;
            classification = toupper(classification);
      }
      switch (classification)
      {
      case 'A':rate = 10.25;break;
      case 'B':rate = 8.5;break;
      case 'C':rate = 6.3;break;
      case 'D':rate = 4.65;break;
      }
      return 0;

}
void Wages::calWage()
{

      wage = (rate*hours);
      if (hours > 40)
      {
            wage = (wage+((hours-40)* rate/2));
      }
      
}
void Wages::assignTax()
{

      if (wage<=200.00)
      {tax = (wage *.12);
      cout <<"Tax rate:"<<" .12"<< endl;
      }
      else
            if
                  (wage >200.00 && wage <= 350.00)
            {
                  tax = (wage *.15);
                  cout <<"Tax rate:"<<" .15"<< endl;
            }
            else
            {
                  tax = (wage *.18);
                  cout <<"Tax rate:"<<" .18"<< endl;
            }

}
void Wages::netPay()
      
{      float grossPay;
   
    grossPay = (wage-tax);
      
      cout<< grossPay<<endl;
}
void Wages::displayHeadings()
{
      cout << "================================================="
            << "=====================\n";
      cout<<endl;
      cout << setw (12) << left << "Name"
            << setw (4) << right << "Hours Worked"
            << setw (7) << right << "Class"
            << setw (11) << right << "Hrly Wage"
            << setw (9) << right << "Net Pay"
            << setw (6) << right << "Tax"
            << setw (12) << right << "Gross Pay" << endl;
      cout << "------------------------------------------------"
            << "----------------------\n";
}
void Wages::displayLine()
{
      cout << setw (12) << left  << name
            << setw (11) << right << hours
            << setw (8) << right << classification
            << setw (11)  << right << rate
            << setw (7) <<"$" << right <<wage
            << setw (6) <<"$" << right <<tax
            << setw (9) <<"$" << right <<grossPay ;
      cout << endl;
      cout << endl;      
}      
   
0
 
SteHConnect With a Mentor Commented:
So the first post was the solution:

void Wages::netPay()
     
{     float grossPay;
   
    grossPay = (wage-tax);
     
     cout<< grossPay<<endl;
}

should change to

void Wages::netPay()
{     float grossPay;
    this->grossPay = (wage-tax); // this makes the local variable unsued
     cout<< grossPay<<endl;
}
or better:
void Wages::netPay()
{
    grossPay = (wage-tax); // this-> is not needed anymore
     cout<< grossPay<<endl;
}
0
 
bananaamyAuthor Commented:
Removing     float grossPay;  corrected my problem. Thank-you, so that statement redefine the vari ble within the funtion causing other funtions not to see it?
0
 
Hamed ZaghaghiProgrammerCommented:
no they can see the member variable, but u have stroed the result of your calculation in the local varibale not in the member varibale, so the member variable has the initial value not the calculated value.
0
 
jhshuklaConnect With a Mentor Commented:
whenever you enter { }, you are entering in a new "scope". if you declare a variable and the parent scope has a variable by the same name, the parent's variable gets hidden by the local variable. note that this parent-child relationship is for nested {} and not for function calls.

classes are different case. if the compiler cannot find a variable declared locally, then it searches the members and adds this->. all this is hidden from the programmer.
0
 
pankajtiwaryConnect With a Mentor Commented:
Refering the function below:

void Wages::netPay()
     
{     float grossPay;
   
    grossPay = (wage-tax);
     
     cout<< grossPay<<endl;
}

We already have one variable named grossPay declared in the class as a private member. Then why are you defining one more with the same name. You need to understand this.

As soon as you define a new variable in a scope, any reference made inside that scope will work for the newly defined variable and not the old one. Here as soon as you calculate grossPay = ( wage - tax ), it calculates for the gross pay defined just in the funation and not the old one. You need to change it as:

void Wages::netPay()
     
{    // float grossPay;
   
    grossPay = (wage-tax);  // Here it will refer to the class variable gross pay since no other reference with the name
     
     cout<< grossPay<<endl;
}

This should work fine. Hope this helps.
0
 
jhshuklaCommented:
just FYI. if you have a static member for a class, and you declare a local variable by the same name then you can access the static variable by className::varName.
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.