Вы вычисляете значение sal
из неинициализированных элементов в конструкторе по умолчанию: sal = (basic + hra + da + cla);
. Таким образом, ваша программа выполняет неопределенное поведение.
Это потому, что конструктор работает перед любым другим членом. Чтобы решить эту проблему, вы должны сначала получить значения, а затем рассчитать следующее:
Salary() : Employee(){
// cout << basic << ", " << hra << ", " << da << ", " << cla << endl; // this line proves that hra, basic... are not initialized.
set(); // assign values before calculate.
sal = (basic + hra + da + cla);
}
Я рекомендую удалить эту строку из конструктора по умолчанию: sal = (basic + hra + da + cla);
и поместить ее в set
. так set()
будет выглядеть так:
void set(){
cout << "Enter Basic Pay: ";
cin >> basic;
cout << "Enter HRA: ";
cin >> hra;
cout << "Enter Da: ";
cin >> da;
cout << "Enter CLA: ";
cin >> cla;
sal = (basic + hra + da + cla); // after getting values it is a good place here to process the sal.
}
Еще одна вещь, которую следует учитывать, - main
должна возвращать целое число, а не void Возвращение void
неверно.
Также не используйте символьные строки, но используйте std::string
, которое стоит использовать:
class Employee{
std::string name;
int id;
// ...
};
Кроме того, получение Salary
из Employee
не имеет значения:
Спросите себя: "Является ли salray служащим?" Таким образом, уместным является достижение отношения Has-a
вместо Is-a
, потому что у сотрудника есть зарплата, но он не является наемником.
class Salary {
public:
Salary() :
sal{}, basic{}, hra{}, da{}, cla{} {
}
void set() {
std::cout << "Enter Basic Pay: ";
std::cin >> basic;
std::cout << "Enter HRA: ";
std::cin >> hra;
std::cout << "Enter Da: ";
std::cin >> da;
std::cout << "Enter CLA: ";
std::cin >> cla;
sal = basic + hra + da + cla;
}
void show() {
std::cout << "Salary: " << sal << std::endl;
}
private:
int sal, basic, hra, da, cla;
};
class Employee {
public:
Employee() :
name{}, id{}, sal{} {
}
void Getdata() {
std::cout << "Enter Name: ";
std::getline(std::cin, name);
std::cout << "Enter ID: ";
std::cin >> id;
sal.set();
}
void Putdata() {
std::cout << name << std::endl;
std::cout << id << std::endl;
sal.show();
}
private:
std::string name;
int id;
Salary sal;
};
int main(){
Employee emp{};
emp.Getdata();
emp.Putdata();
}
- NB. Код, который я написал, не компилируется в "Turbo C ++". Пожалуйста, откажитесь от этого старого и ошибочного компилятора и используйте его, если он новый.