2013-09-16 4 views
2

Я прочитал несколько ранее задаваемых вопросов по этой теме, но не могу найти ответ, который я ищу. Когда я запускаю программу, я не получаю никаких ошибок, но я получаю много данных об мусоре. Я знаю, это потому, что я не передаю параметры правильно, но я новичок в C++ и, в частности, как правильно использовать указатели. Чтобы сделать его простым: я передаю объект сотрудника через PrintCheck(), который вызывает функцию CalcSalary(), которая должна использовать GetHours() и GetWage() для доступа к данным элемента для выполнения расчетов и возврата правильного salary. Поблагодарили бы за любые объяснения, почему я генерирую данные мусора!Передача объектов класса в функциональные параметры C++

У меня есть класс:

class Employee 
{ 
private: 
    int employeeNumber; 
    string name; 
    string streetAddress; 
    string phoneNumber; 
    double hourlyWage; 
    double hoursWorkedperWeek; 
public: 
    Employee(void); 
    Employee(int, string, string, string, double, double); 
    int GetEmployeeNum() const; 
    void SetEmployeeNum(int); 
    string GetName() const; 
    void SetName(string); 
    string GetAddress() const; 
    void SetAddress(string); 
    string GetPhone() const; 
    void SetPhone(string); 
    double GetWage() const; 
    void SetWage(double); 
    double GetHours() const; 
    void SetHours(double); 
    double CalcPay(double, double); 
}; 

У меня также есть функция, которая должна взаимодействовать с классом:

void PrintCheck(Employee&); 

Моя главная функция выглядит следующим образом:

void main() 
{ 
    Employee joe(1, "Joe Blo", "125 Cool St.", "555 555 5555", 10.00, 45); //create employee 1 
    Employee jane(2, "Jane Doe", "521 Dumb St.", "1 800 555 5555", 12.50, 30); //create employee 2 
    PrintCheck(joe); //print check 
} 

Функция printcheck выглядит следующим образом:

void PrintCheck(Employee& a) 
{ 

    cout << "Pay to the order of " << a.GetName() << "..................................."; 
    cout << a.CalcPay(a.GetWage(), a.GetHours()) << endl; 
    cout << "Hours worked: " << a.GetHours() << endl; 
    cout << "Hourly wage: " << a.GetWage() << endl; 
} 

функция Calcpay является:

double Employee::CalcPay(double h, double w) 
{ 
    double salary = 0; 
    int OT = 40; 
    double timeandahalf = 1.5; 
    double STATE = .075; 
    double FED = .20; 
    if (h > OT) // overtime 
    { 
     salary = h * (w * timeandahalf); // calc time and a half 
     salary = salary * STATE; // calc state deductions 
     salary = salary * FED; // calc federal deductions 
    } 
    else 
    { 
     salary = h * w; // calc salary 
     salary = salary * STATE; // calc state deductions 
     salary = salary * FED; // calc federal deductions 
    } 
    cout.setf(ios::fixed); 
    cout.setf(ios::showpoint); 
    cout.precision(PRECISION); 
    return salary; 
} 

Мои "получить" функции все следуют этому шаблону:

int Employee::GetEmployeeNum() const 
{ 
    return employeeNumber; 
} 

Мой ожидаемый результат будет:

Pay to the order of: Joe Blo............ $salary. 
Hours worked: $hours. 
Hourly wage: $wage. 

Что я получил:

Pay to the order of: ........................ 128509280503000000000000000000000000000.00 (this number is long, but I didn't feel like typing them all) 
Hours worked: -9723636237 (same, just tons of bs numbers) 
Hourly wage: (the exact same number as above) 

Мой конструктор класса:

Employee::Employee(int en, string n, string a, string p, double w, double h) 
{ 
    int employeeNumber = en; 
    string name = n; 
    string streetAddress = a; 
    string phoneNumber = p; 
    double hourlyWage = w; 
    double hoursWorkedperWeek = h; 
} 
Employee::Employee() 
{ 
} 
+1

Почему бы вам не включить то, что вы ожидали, и то, что вы действительно получили в своем вопросе? – greatwolf

+1

Как выглядит реализация для вашего конструктора 'Employee (int, string, string, string, double, double)'? –

+0

Смотрите на свой язык. Я отредактирую это для вас на этот раз, но в будущем мода может удалить ваш пост, даже не моргая. –

ответ

4

Ваш Employee::Employee(int en, string n, string a, string p, double w, double h) объявляет новые локальные переменные внутри нее и, следовательно, затенения переменные-члены внутри вашего класса. Таким образом, в действительности вы никогда не инициализировали ни один из его членов во время строительства.

Следующая должны исправить эту проблему:

Employee::Employee(int en, string n, string a, string p, double w, double h) 
    : employeeNumber (en), 
    name (n), 
    streetAddress (a), 
    phoneNumber (p), 
    hourlyWage (w), 
    hoursWorkedperWeek (h) 
{ 
} 
+0

Это не работает. Когда я пытаюсь это сделать, компилятор не узнает ни одного из членов данных. – xavi

+0

Ошибка сборки говорит, что «найден в том, что должно быть списком, разделенным запятой». На каждой из строк. – xavi

+0

@ xavi whoops, забыл исправить запятые во время копирования/вставки, попробуйте сейчас – greatwolf

2

Это ошибка

Employee::Employee(int en, string n, string a, string p, double w, double h) 
{ 
    int employeeNumber = en; 
    string name = n; 
    string streetAddress = a; 
    string phoneNumber = p; 
    double hourlyWage = w; 
    double hoursWorkedperWeek = h; 
} 

должно быть

Employee::Employee(int en, string n, string a, string p, double w, double h) 
{ 
    employeeNumber = en; 
    name = n; 
    streetAddress = a; 
    phoneNumber = p; 
    hourlyWage = w; 
    hoursWorkedperWeek = h; 
} 

или даже лучше, это должно быть, как в ответ greatwolf в.

Ошибка в вашей версии заключается в том, что вы указали переменные в своем конструкторе с точно такими же именами, что и члены вашего класса. Эти переменные скрыть ваших членов класса, поэтому ваш конструктор не инициализирует ваш класс. Таким образом, вы получаете мусор.

+0

Спасибо за помощь. Я не могу поверить, что проблема была настолько глупой и легко упускаемой из виду. В целом, мое понимание больше. Еще раз спасибо. – xavi

+0

@ xavi C++ полна gotchas. – john

Смежные вопросы