В этом коде я прошу пользователя указать его имя, часы работы и скорость в час, а затем умножить оба, чтобы получить его зарплату. Я делаю это с помощью функции указателя, но по какой-то причине, когда программа переходит к функции calculate_salary, она заканчивается ошибкой. Что не так и почему это происходит?
#include <iostream>
#include <string>
using namespace std;
class Employee
{
public:
string name;
double salary;
double hours;
double cash_per_hour;
int age;
Employee(){}
double* salary_calculator(double *h, double *c_p_h)
{
double *p;
*p = (*h) * (*c_p_h);
cout<<"here"<<endl;
return(p);
}
void display()
{
cout<<endl<<endl<<"*********************"<<endl;
cout<<"The salary is "<<salary<<endl;
cout<<"*********************"<<endl;
}
void get_salary()
{
double *s;
s = salary_calculator(&hours, &cash_per_hour);
salary = *s;
}
void get_details()
{
cout<<"********************************"<<endl;
cout<<"WELCOME TO THE SALARY CALCULATOR"<<endl;
cout<<"Please enter your name "<<endl;
cin>>name;
cout<<"Please enter the number of hours worked"<<endl;
cin>>hours;
cout<<"Please enter the rate per hour"<<endl;
cin>>cash_per_hour;
cout<<"***************END****************"<<endl;
}
};
int main()
{
Employee one;
one.get_details();
one.get_salary();
one.display();
return 0;
}
Как уже было сказано в моем комментарии: функция возвращает указатель на переменную p. Однако p выходит за рамки (т.е. Существует только в самой функции). Поэтому возвращаемый указатель указывает на что-то, и мы не знаем, что, также называемое диким указателем.
Чтобы этого избежать, вы должны просто вернуться по значению, поскольку это примитивный тип. Когда вы действительно хотите вернуть указатель, вам нужно выделить память. Для объекта вы можете выделить память с помощью функции new. Например: "double * p = new double;".
Имейте в виду, что вам нужно освободить выделенную память, когда вам это больше не понадобится, иначе у вас будет утечка памяти. Подробнее об этом читайте здесь: http://www.tutorialspoint.com/cplusplus/cpp_dynamic_memory.htm
Указатель p
в salary_calculator
не связан с каким-либо выделенным пространством. Поэтому разыменование его приводит к неопределенному поведению.
Вместо использования указателей здесь просто измените тип возврата, чтобы double
и настроить свою программу в соответствии с этим.