#c #addition
Вопрос:
В этой программе, в которой я принимаю некоторые ценности и просто добавляю их. Программа принимает значения, но показывает неправильное добавление.
#include<iostream.h>
#include<conio.h>
class Employee
{
char name[30];
int id;
public:
void Getdata()
{
cout<<"Enter Name: ";
cin>>name;
cout<<"Enter ID: ";
cin>>id;
}
Employee()
{
}
void Putdata()
{
cout<<name<<endl;
cout<<id<<endl;
}
};
class Salary : public Employee
{
int sal;
int basic, hra, da, cla;
public:
void set()
{
cout<<"Enter Basic Pay: ";
cin>>basic;
cout<<"Enter HRA: ";
cin>>hra;
cout<<"Enter Da: ";
cin>>da;
cout<<"Enter CLA: ";
cin>>cla;
}
Salary() : Employee()
{
sal = (basic hra da cla) ;
}
void show()
{
cout<<"Salary: "<<sal;
}
};
void main()
{
clrscr();
Salary s;
s.Getdata();
s.set();
s.Putdata();
s.show();
getch();
}
Я ожидал, что зарплата составит 13000, но вместо этого получил Зарплату: 11172 в результате.
Комментарии:
1. Похоже, вам, возможно, потребуется научиться использовать отладчик для пошагового выполнения кода. С хорошим отладчиком вы можете выполнять свою программу построчно и видеть, где она отклоняется от того, что вы ожидаете. Это необходимый инструмент, если вы собираетесь заниматься каким-либо программированием. Дальнейшее чтение: Как отлаживать небольшие программы и руководство по отладке
2. Не связано с вашей проблемой, но зарплата, получаемая от сотрудника, кажется действительно странной иерархией классов. Я имею в виду, в каком смысле зарплата такая же, как у работника?
3. Кроме того, вы случайно не используете TurboC ?
void main
и заголовки, которые вы используете, будут/не должны компилироваться в стандартном компиляторе жалоб.4.
sal = (basic hra da cla) ;
вычисляет немедленное значение и устанавливаетsal
это значение. Это не создает отношения, изменение любого из операндов, используемых постфактум, не приведет к ретроактивному обновлениюsal
до нового значения. Вам придется выполнить расчет после того, как вы воспользуетесь данными пользователя.5. В конструкторе по умолчанию
Salray
вы написали:sal = (basic hra da cla) ;
но эти переменные-члены еще не инициализированы!
Ответ №1:
Вы вычисляете значение 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
— неправильно. - Также не используйте символьные строки, но используйте
std::string
их достойно использования:class Employee{ std::string name; int id; // ... };
- Также создание
Salary
производных отEmployee
не имеет значения:
Спросите себя: «Является ли салрей сотрудником?» Поэтому важно наладить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(); }
- ПРИМЕЧАНИЕ: Код, который я написал, не компилируется на «Turbo C «. Пожалуйста, откажитесь от этого старого и ошибочного компилятора и используйте его, если появятся новые сложные.