【问题标题】:Wrong addition values错误的附加值
【发布时间】:2019-04-22 19:34:15
【问题描述】:

在这个程序中,我接受一些值并添加它们。该程序正在接受值,但显示错误的添加。

#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。

【问题讨论】:

  • 听起来你可能需要学习如何使用调试器来单步调试你的代码。使用好的调试器,您可以逐行执行您的程序,并查看它与您期望的偏差在哪里。如果您要进行任何编程,这是必不可少的工具。进一步阅读:How to debug small programsDebugging Guide
  • 与您的问题无关,但从 Employee 派生的 Salary 似乎是一个非常奇怪的类层次结构。我的意思是,在什么方面薪水与雇员相同?
  • 另外,您是否偶然使用了 TurboC++? void main 和您正在使用的标头将/不应在标准投诉编译器中编译。
  • sal = (basic+hra+da+cla) ; 计算一个立即值并将sal 设置为该值。它不会创建关系,更改任何事后使用的操作数不会将sal 追溯更新为新值。您必须在获取用户输入后执行计算。
  • Salray的默认构造函数中你写了:sal = (basic+hra+da+cla) ;但是这些成员变量还没有初始化!

标签: c++ addition


【解决方案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。返回void 是错误的。

  • 也不要使用字符串而是使用std::string 值得使用:

    class Employee{
        std::string name;
        int id;
        // ...
    };
    
  • 也使从Employee 派生的Salary 无关紧要: 问问自己:“薪水是雇员吗?”所以相关的是实现Has-a 关系而不是Is-a,因为员工确实有薪水,但他不是salaray。

    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++”上编译。请放弃那个旧的和错误的编译器,如果是新的复杂的编译器,请使用它。

【讨论】:

    猜你喜欢
    • 2021-04-18
    • 1970-01-01
    • 2015-05-31
    • 2015-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-26
    • 1970-01-01
    相关资源
    最近更新 更多