重载构造函数出错

时间:2013-10-04 03:26:42

标签: visual-c++

#include <iostream>
#include <string>
#include <stdlib.h>
#include <iomanip>

using namespace std;

    const double MIN_SALARY = 10000;
    const double MAX_SALARY = 1000000;
    const int MAX_DEPENDENTS = 20;
    const int MIN_DEPENDENTS = 0;
    const char DEFAULT_GENDER = 'U'; 
    const int NUMBER_WEEKS = 24;
    const int MIN_MANAGEMENT_LEVEL = 0;
    const int MAX_MANAGEMENT_LEVEL = 3;
    const double MIN_HOURS = 0;
    const double MAX_HOURS = 50;
    const double MIN_WAGE = 10;
    const double MAX_WAGE = 50;
    const int WORK_WEEKS = 50;
    const double BONUS_PERCENT = .10;

class Hourly :public Employee
{
    protected:
    double wage;
    double hours;
    string category;

    public:

    Hourly():Employee()
    {
    }

    Hourly(string firstName, string lastName, char gender, int dependents, double wage, double hours, Benefit benefits, string category):Employee(firstName, lastName, gender, dependents, benefits)
    {
        setWage(wage);
        setHours(hours);
        setCategory(category);
        setAnnualSalary(wage, hours);

    }

    Hourly(double wage, double hours, string category):Employee()
    {
        setWage(wage);
        setHours(hours);
        setCategory(category);
    }

    double getWage()
    {
        return wage;
    }

    void setWage(double wage)
    {
        if (wage >= MIN_WAGE && wage <=MAX_WAGE)
        {
            this->wage = wage;
        }
        else if (wage < MIN_WAGE)
        {
            this->wage = MIN_WAGE;
        }
        else
        {
            this->wage = MAX_WAGE;
        }
    }
    double getHours()
    {
        return hours;
    }
    void setHours (double hours)
    {
        if (hours > MIN_HOURS && hours < MAX_HOURS)
        {
            this->hours = hours;
        }
        else if (hours <= MIN_HOURS)
        {
            this->hours = MIN_HOURS;
        }
        else 
        {
            this->hours = MAX_HOURS;
        }
    }
    string getCategory()
    {
        return category;
    }
    void setCategory(string category)
    {
        if (category.compare("temporary")==0)
        {
            this->category = category;
        }
        else if (category.compare("part time")==0)
        {
            this->category = category;
        }
        else if (category.compare("full time")==0)
        {
            this->category=category;
        }
        else 
        {
            this->category = "Unknown";
        }
    }

    double calculatePay()
    {
        return wage * hours;
    }

    void setAnnualSalary(double wage, double hours)
    {
        Employee::setAnnualSalary(calculatePay() * WORK_WEEKS);
    }

    void displayEmployee()
    {
        setAnnualSalary(wage, hours);
        Employee::displayEmployee();
        cout<<"Hourly Employee\n";
        cout<<"Category:\t\t" << category << "\n";
        cout<<"Wage:\t\t\t" << wage << "\n";
        cout<<"Hours:\t\t\t" << hours << "\n";

    }

};

class Salaried :public Employee
{
    protected:
    int managementLevel;

public:

Salaried():Employee()
{
    managementLevel = MIN_MANAGEMENT_LEVEL;
}

Salaried(string firstName, string lastName, char gender, int dependents, double salary, Benefit benefits, int manLevel):Employee(firstName, lastName, gender, dependents, salary, benefits)
{
    setManagementLevel(manLevel);
}

Salaried(double salary, int manLevel):Employee()
{
    Employee::setAnnualSalary(salary);
    setManagementLevel(manLevel);
}
void setManagementLevel(int manLevel)
{
    if (manLevel >= MIN_MANAGEMENT_LEVEL && manLevel <=MAX_MANAGEMENT_LEVEL)
    {
        managementLevel = manLevel;
    }
    else
    {
        managementLevel = MIN_MANAGEMENT_LEVEL;
    }
}

int getManagementLevel()
{
    return managementLevel;
}
double calculatePay()
{
    return Employee::calculatePay() * (1+ (managementLevel*BONUS_PERCENT));
}
void displayEmployee()
{
    Employee::displayEmployee();
    cout<<"Salaried Employee\n";
    cout<<"Management level:\t" << managementLevel;
}

};





class Benefit
{
private:
    string healthInsurance;
    double lifeInsurance;
    int vacation;

public:
    Benefit()
    {
        this->healthInsurance = "not provided";
        this->lifeInsurance = 0;
        this->vacation = 14;
    }
    Benefit(string healthInsurance, double lifeInsurance, int vacation)
    {
        this->healthInsurance=healthInsurance;
        this->lifeInsurance=lifeInsurance;
        this->vacation=vacation;
    }
    Benefit(Benefit &mybenefit)
    {
        this->healthInsurance = mybenefit.healthInsurance;
        this->lifeInsurance = mybenefit.lifeInsurance;
        this->vacation = mybenefit.vacation;
    }
    string getHealthInsurance()
    {
        return healthInsurance;
    }
    void setHealthInsurance(string healthInsurance)
    {
        this->healthInsurance = healthInsurance;
    }
    double getLifeInsurance()
    {
        return lifeInsurance;
    }
    void setLifeInsurance (double lifeInsurance)
    { 
        this->lifeInsurance = lifeInsurance;
    }
    int getVacation()
    {
        return vacation;
    }
    void setVacation(int vacation)
    {
        this->vacation = vacation;
    }
    void displayBenefits()
    {
        cout<<"\nBenefit Information\n";
        cout<<"__________________________________________\n";
        cout<<"Health Insurance:\t" <<healthInsurance << "\n";
        cout<<"Life Insurance:\t\t" <<lifeInsurance << "\n";
        cout<<"Vacation:\t\t" <<vacation << " days\n";
    }
};

class iEmployee
{
public:
    virtual double calculatePay()=0;
};







class Employee : public iEmployee
{
    protected:
    string firstName;
    string lastName;
    char gender;
    int dependents;
    double annualSalary;

    static int numEmployees; 

    //declare a benefit object
    Benefit benefits;


    public:

        Employee():benefits()//default constructor
        {
            firstName = "";
            lastName = "";
            gender = 'N';
            annualSalary = 90000;
            this->numEmployees += 1;
        }



        Employee(string firstName, string lastName, char gender, int dependents, double salary, Benefit mybenefits):benefits(mybenefits)
        {
            this->firstName = firstName;
            this->lastName = lastName;
            this->gender = gender;
            this->dependents = dependents;
            this->annualSalary = salary;
            this->numEmployees += 1;
        }

        Benefit getBenefits()
        {
            return benefits;
        }
        void setBenefits(Benefit benefits)
        {
            this->benefits = benefits;
        }


        //a static method that returns the number of emplyee object that are created
        static int getNumberEmployees()
        {
            return numEmployees;
        }


        string getFirstName()
        {
            return firstName;
        }
        void setFirstName(string name)
        {
            firstName = name;
        }
        string getLastName()
        {
            return lastName;
        }
        void setLastName(string name)
        {
            lastName = name;
        }
        char getGender()
        {
            return gender;
        }
        void setGender(char gen)
        {
            switch (gen)
            {
                case'f': case'F': case'M': case'm':
                gender = gen;
                break;
                default:
                gender = DEFAULT_GENDER;
            }
        }
        int getDependents()
        {
            return dependents;
        }
        void setDependents(int dep)
        {
            if (dep >= MIN_DEPENDENTS && dep <= MAX_DEPENDENTS)
            {
                dependents = dep;
            }
            else if (dep < MIN_DEPENDENTS)
            {
                dep = MIN_DEPENDENTS;
            }
            else
            {
                dependents = MAX_DEPENDENTS;
            }
        }
        void setDependents (string dep)
        {
            dependents = atoi(dep.c_str());//Converts string to integer.
        }
        double getAnnualSalary()
        {
            return annualSalary;
        }
        void setAnnualSalary(double salary)
        {
            if(salary >= MIN_SALARY && salary <= MAX_SALARY)
            {
                annualSalary = salary;
            }
            else if (salary < MIN_SALARY)
            {
                annualSalary = MIN_SALARY;
            }
            else
            {
                annualSalary = MAX_SALARY;
            }
        }

        void setAnnualSalary(string salary)
        {
            annualSalary = atof(salary.c_str());//Converts from string to floating point number.
        }
        double calculatePay()
        {
            return annualSalary/NUMBER_WEEKS;
        }

        void displayEmployee()
        {
            cout<<"First Name:\t"<<firstName<<endl; 
            cout<<"Last Name:\t"<<lastName<<endl; 
            cout<<"Gender:\t"<<gender<< "\n"; 
            cout<<"Dependents:\t"<<dependents<< "\n"; 
            cout<<"Annual Salary:\t" << setprecision(2)<<showpoint<<fixed<<annualSalary << "\n";  
            cout<<"Weekly Salary:\t" << setprecision(2)<<showpoint<<fixed<<calculatePay() << "\n"; 

        //show the benefits
        this->benefits.displayBenefits();

        }                                                


};

  int Employee::numEmployees=0; //Supply initial value to data members.

        void DisplayApplicationInformation()
        {
            cout<<"Welcome to my first OOP Employee Class Design"<<endl;
            cout<<"Stoyan Naydenov"<<endl;
            cout<<"COMP220 WEEK 2 iLAB"<<endl;
        }


        void DisplayDivider(string message)
        {
            cout<<"\n************ " + message + " ************\n";
        }


        string GetUserInput(string message)
        {
            string mystring;
            cout<<"Please enter your "<<message;
            getline(cin, mystring);
            return mystring;

        }


        void TerminateApplication()
        {
            cout<<"\nThanks for using my simple program. \n";
        }


int main()
{
    Employee genericEmp;
    char gender;
    string str;
    double lifeInsurance;
    int vacation;


    DisplayApplicationInformation();

    DisplayDivider("Employee 1");

    //access the employee objects members using the DOT notation
    genericEmp.setFirstName(GetUserInput("First Name "));
    genericEmp.setLastName(GetUserInput("Last Name "));

    str = GetUserInput("Gender ");
    gender = str.at(0);
    genericEmp.setGender(gender);

    genericEmp.setDependents(atoi(GetUserInput("Dependents ").c_str()));
    genericEmp.setAnnualSalary(atoi(GetUserInput("Annual Salary ").c_str()));

    Benefit theBenefits;

    //set the benefit information
    theBenefits.setHealthInsurance(GetUserInput("Health Insurance "));
    theBenefits.setLifeInsurance(atof(GetUserInput("Life Insurance ").c_str()));
    theBenefits.setVacation(atoi(GetUserInput("Vacation Days ").c_str()));
    genericEmp.setBenefits(theBenefits);
    genericEmp.displayEmployee();

    //use the Class levle static method to display the number of employees
    cout<<"---Number of Employee Object Created---";
    cout<<"\tNumber of employees:" <<Employee::getNumberEmployees(); 

    DisplayDivider("Employee 2");

    Salaried salariedEmp;
    salariedEmp.setFirstName(GetUserInput("First Name "));
    salariedEmp.setLastName(GetUserInput("Last Name "));
    str = GetUserInput("Gender ");
    gender = str.at(0);
    salariedEmp.setGender(gender);
    salariedEmp.setDependents(atoi( GetUserInput("Dependents ").c_str()));
    salariedEmp.setAnnualSalary(atof(GetUserInput("Annual Salary ").c_str()));

    //Setting Up Benefit Information For 2nd Employee
    theBenefits.setHealthInsurance(GetUserInput("Health Insurance "));
    theBenefits.setLifeInsurance(atof(GetUserInput("Life Insurance ").c_str()));
    theBenefits.setVacation(atoi(GetUserInput("Vacation Days ").c_str()));
    salariedEmp.setBenefits(theBenefits);
    salariedEmp.setManagementLevel(3);
    salariedEmp.displayEmployee();


    cout<<"\n---Number of Employee Object Created ---";
    cout<<"tNumber of Employees:"<<Employee::getNumberEmployees();

    //Use a utility method to keep a consistent format to the output
    DisplayDivider("Employee 3");

    //creating hourly employee, but using generic employee as a base
    Hourly hourEmp(genericEmp.getFirstName(), genericEmp.getLastName(), genericEmp.getGender(), genericEmp.getDependents(), 40.0, 50.0, genericEmp.getBenefits(), "Full Time");

    //Access the employee objects members using the DOT notation
    hourEmp.setFirstName(GetUserInput("First Name "));
    hourEmp.setLastName(GetUserInput("Last Name "));

    str = GetUserInput("Gender ");
    gender = str.at(0);
    hourEmp.setGender(gender);

    hourEmp.setDependents(atoi(GetUserInput("Dependents ").c_str()));

    //Set the Benefit Information
    theBenefits.setHealthInsurance(GetUserInput("Health Insurance "));
    theBenefits.setLifeInsurance(atof(GetUserInput("Life Insurance ").c_str()));
    theBenefits.setVacation(atoi(GetUserInput("Vacation Days ").c_str()));

    hourEmp.setBenefits(theBenefits);
    hourEmp.displayEmployee();

    cout<<"\n---Number of Employee Object Created ---";
    cout<<"tNumber of Employees:"<<Employee::getNumberEmployees();

    TerminateApplication();

    system ("Pause");
    return 0;

}

嘿家伙几乎是重载的构造函数

每小时(string firstName,string lastName,char gender,int dependents,double wage,double hours,Benefit benefits,string category):Employee(firstName,lastName,gender,dependents,benefits)

给我带来麻烦,我似乎无法弄清楚如何进行调试。我已经在这几个小时了。任何帮助表示赞赏。我是新手,所以任何有用的提示总是受到赞赏。

http://i.imgur.com/p9zZJON.png

0 个答案:

没有答案