鱼C论坛

 找回密码
 立即注册
查看: 2344|回复: 11

[已解决]c++抽象类,程序一直崩溃,救救孩子吧

[复制链接]
发表于 2021-6-5 22:14:10 | 显示全部楼层 |阅读模式
60鱼币
为某公司设计雇员工资发放系统。
每个雇员的基本信息包括:姓名(name),工号(id)。
雇员的收入取决于雇员的类型。该公司共有四类雇员:
周薪雇员(SalariedEmployee):收入=固定周薪。
时薪雇员(HourlyEmployee):若工作40小时以下,收入=小时数*每小时薪水;若工作40小时以上,收入=40*每小时薪水+(小时数-40)*每小时薪水*150%。
佣金雇员(CommissionEmployee):收入=销售量*每个商品的销售佣金
带底薪佣金雇员(BasePlusCommissionEmployee):收入=底薪+销售量*每个商品的销售佣金
要求:建立雇员继承层次,每个类包含计算工资和显示输出的功能,可以计算和显示输出公司雇员(Employee)的每周收入。输出时要显示该类雇员的所有信息。(包括雇员类型、姓名、工号、工资各项明细),写出主函数测试各类。在雇员基本信息中增加雇员的生日(birthDate),并设计日期类(Date)来表示生日。在主函数中创建一个容器用来管理公司各种雇员对象,多态地计算并输出每个雇员的工资。如果雇员的生日在本月,就奖给该雇员100元。同时,在本次工资发放阶段,公司决定奖励带薪佣金雇员,把他们的基本工资提高10%。
设计提示:使用抽象类。

#include <iostream>
#include <string>

using namespace std;

class Salary{
public :
    virtual void calculate(void) = 0;
    virtual void print_result(void) = 0;
    virtual ~Salary(){};
};

class Date{
private :

public :
    int year, month, day;
    Date(int y, int m, int d) : year(y), month(m), day(d){};
    bool isbirthday(void){ return month == 1;}
    ~Date(){};
};

class SalariedEmployee : public Salary{
private :
    int salary = 4*1000;
    string Name, Id;
    Date *birthday;

public :
    SalariedEmployee(string pname, string pid){ Name = pname, Id = pid;}

    void calculate(void){
    cout << "请输入该周薪员工" << Name<<"的生日" << endl;
    cout << "请输入出生年!" << endl;
    cin >> birthday->year;
    cout << "请输入出生月!" << endl;
    cin >> birthday->month;
    cout << "请输入出生日!" << endl;
    cin >> birthday->day;
    if(birthday->isbirthday()) salary += 100;}
    void print_result(void){
        cout << "该员工为周薪员工\n姓名为:" << Name << endl;
        cout << "工号为:" << Id << endl;
        if(birthday->isbirthday())
        cout << "本月为员工生日!奖励100元!" << endl;
        cout << "工资为(固定周薪为1000元):"  << salary << endl;
        }
    ~SalariedEmployee(){delete this;}
};

class HourlyEmployee : public Salary{
private :
    int salary = 0;
    string Name, Id;
    Date *birthday;
    int hour;

public :
    HourlyEmployee(string pname, string pid)
    {
    Name = pname, Id = pid;
    cout << "请输入该时薪员工" << Name<<"的生日" << endl;
    cout << "请输入出生年!" << endl;
    cin >> birthday->year;
    cout << "请输入出生月!" << endl;
    cin >> birthday->month;
    cout << "请输入出生日!" << endl;
    cin >> birthday->day;
    }

    void calculate(void){
        cout << "请输入该时薪员工" << Name<< "工作时长:";
        cin >> hour;

        if(hour <= 40)
        {
        salary = hour * 20;
        }
        else
        {
        salary = 800 + (hour - 40) * 30;
        }
        if(birthday->isbirthday()) salary += 100;
    }
    void print_result(void){
    cout << "该员工为时薪员工\n姓名为:" << Name << endl;
    cout << "工号为:" << Id << endl;
    if(birthday->isbirthday())
        cout << "本月为员工生日!奖励100元!" << endl;
    cout << "工资为(基础时薪为20元):" << salary << endl;
    }
    ~HourlyEmployee(){};
};

class CommissionEmployee : public Salary{
private :
    int salary = 0;
    string Name, Id;
    Date *birthday;
    int num;

public :
    CommissionEmployee(string pname, string pid)
    {
    Name = pname, Id = pid;
    cout << "请输入该佣金员工" << Name<<"的生日" << endl;
    cout << "请输入出生年!" << endl;
    cin >> birthday->year;
    cout << "请输入出生月!" << endl;
    cin >> birthday->month;
    cout << "请输入出生日!" << endl;
    cin >> birthday->day;
    }

    void calculate(void){
        cout << "请输入该佣金员工" << Name<<"销售数量:";
        cin >> num;
        salary = num * 5;
       if(birthday->isbirthday()) salary += 100;
    }
    void print_result(void){
    cout << "该员工为佣金员工\n姓名为:" << Name << endl;
    cout << "工号为:" << Id << endl;
    if(birthday->isbirthday())
        cout << "本月为员工生日!奖励100元!" << endl;
    cout << "工资为(销售佣金为5元):" << salary << endl;
    }
};

class BasePlusCommissionEmployee : public Salary{
private :
    float salary;
    string Name, Id;
    Date *birthday;
    int num;

public :
    BasePlusCommissionEmployee(string pname, string pid)
    {
    Name = pname, Id = pid;
    cout << "请输入该带底薪佣金员工" << Name<<"的生日" << endl;
    cout << "请输入出生年!" << endl;
    cin >> birthday->year;
    cout << "请输入出生月!" << endl;
    cin >> birthday->month;
    cout << "请输入出生日!" << endl;
    cin >> birthday->day;
    }

    void calculate(void){
        cout << "请输入该带底薪佣金员工" << Name<<"销售数量:";
        cin >> num;
        salary = num * 3 + 1100;
       if(birthday->isbirthday()) salary += 100;
    }
    void print_result(void){
    cout << "该员工为佣金员工\n姓名为:" << Name << endl;
    cout << "工号为:" << Id << endl;
    if(birthday->isbirthday())
        cout << "本月为员工生日!奖励100元!" << endl;
    cout << "工资为(底薪1100元(提高百分之十!),销售佣金为3元):" << salary << endl;
    }
};

void fn(Salary &A)
{
    A.calculate();
    A.print_result();
}

Salary& inputA(string name, string id)
{
    return *new SalariedEmployee(name, id);
}

Salary& inputB(string name, string id)
{
    return *new HourlyEmployee(name, id);
}

Salary& inputC(string name, string id)
{
    return *new CommissionEmployee(name, id);
}

Salary& inputD(string name, string id)
{
    return *new BasePlusCommissionEmployee(name, id);
}

int main()
{
    cout << "当前为一月份!" << endl;
    Salary& A = inputA("张三", "001");fn(A);
    Salary& B = inputB("李四", "002");fn(B);
    Salary& C = inputC("王五", "003");fn(C);
    Salary& D = inputD("赵六", "004");fn(D);





    return 0;
}
最佳答案
2021-6-5 22:14:11
因为我不知道应该输入些什么,对于这些输入,输出什么才是正确的
只把代码改成这样
#include <iostream>
#include <string>

using namespace std;

class Salary{
public :
    virtual void calculate(void) = 0;
    virtual void print_result(void) = 0;
    virtual ~Salary(){};
};

class Date{
private :

public :
    int year, month, day;


    Date(): year(0), month(0), day(0) {}



    Date(int y, int m, int d) : year(y), month(m), day(d){};
    bool isbirthday(void){ return month == 1;}
    ~Date(){};
};

class SalariedEmployee : public Salary{
private :
    int salary = 4*1000;
    string Name, Id;
    Date *birthday;

public :
    SalariedEmployee(string pname, string pid){ Name = pname, Id = pid;}

    void calculate(void){
        cout << "请输入该周薪员工" << Name<<"的生日" << endl;
        cout << "请输入出生年!" << endl;



        this->birthday = new Date;




        cin >> birthday->year;
        cout << "请输入出生月!" << endl;
        cin >> birthday->month;
        cout << "请输入出生日!" << endl;
        cin >> birthday->day;
        if(birthday->isbirthday()) salary += 100;}
    void print_result(void){
        cout << "该员工为周薪员工\n姓名为:" << Name << endl;
        cout << "工号为:" << Id << endl;
        if(birthday->isbirthday())
            cout << "本月为员工生日!奖励100元!" << endl;
        cout << "工资为(固定周薪为1000元):"  << salary << endl;
    }
    //~SalariedEmployee(){delete this;}
    ~SalariedEmployee(){delete this->birthday;}
};

class HourlyEmployee : public Salary{
private :
    int salary = 0;
    string Name, Id;
    Date *birthday;
    int hour;

public :
    HourlyEmployee(string pname, string pid)
    {
        Name = pname, Id = pid;
        cout << "请输入该时薪员工" << Name<<"的生日" << endl;
        cout << "请输入出生年!" << endl;



        this->birthday = new Date;



        cin >> birthday->year;
        cout << "请输入出生月!" << endl;
        cin >> birthday->month;
        cout << "请输入出生日!" << endl;
        cin >> birthday->day;
    }

    void calculate(void){
        cout << "请输入该时薪员工" << Name<< "工作时长:";
        cin >> hour;

        if(hour <= 40)
        {
            salary = hour * 20;
        }
        else
        {
            salary = 800 + (hour - 40) * 30;
        }
        if(birthday->isbirthday()) salary += 100;
    }
    void print_result(void){
        cout << "该员工为时薪员工\n姓名为:" << Name << endl;
        cout << "工号为:" << Id << endl;
        if(birthday->isbirthday())
            cout << "本月为员工生日!奖励100元!" << endl;
        cout << "工资为(基础时薪为20元):" << salary << endl;
    }
    ~HourlyEmployee(){delete this->birthday;};
};

class CommissionEmployee : public Salary{
private :
    int salary = 0;
    string Name, Id;
    Date *birthday;
    int num;

public :
    CommissionEmployee(string pname, string pid)
    {
        Name = pname, Id = pid;
        cout << "请输入该佣金员工" << Name<<"的生日" << endl;
        cout << "请输入出生年!" << endl;


        this->birthday = new Date;


        cin >> birthday->year;
        cout << "请输入出生月!" << endl;
        cin >> birthday->month;
        cout << "请输入出生日!" << endl;
        cin >> birthday->day;
    }

    void calculate(void){
        cout << "请输入该佣金员工" << Name<<"销售数量:";
        cin >> num;
        salary = num * 5;
        if(birthday->isbirthday()) salary += 100;
    }
    void print_result(void){
        cout << "该员工为佣金员工\n姓名为:" << Name << endl;
        cout << "工号为:" << Id << endl;
        if(birthday->isbirthday())
            cout << "本月为员工生日!奖励100元!" << endl;
        cout << "工资为(销售佣金为5元):" << salary << endl;
    }

    ~CommissionEmployee() {delete this->birthday;}
};

class BasePlusCommissionEmployee : public Salary{
private :
    float salary;
    string Name, Id;
    Date *birthday;
    int num;

public :
    BasePlusCommissionEmployee(string pname, string pid)
    {
        Name = pname, Id = pid;
        cout << "请输入该带底薪佣金员工" << Name<<"的生日" << endl;
        cout << "请输入出生年!" << endl;


        this->birthday = new Date;


        cin >> birthday->year;
        cout << "请输入出生月!" << endl;
        cin >> birthday->month;
        cout << "请输入出生日!" << endl;
        cin >> birthday->day;
    }

    void calculate(void){
        cout << "请输入该带底薪佣金员工" << Name<<"销售数量:";
        cin >> num;
        salary = num * 3 + 1100;
        if(birthday->isbirthday()) salary += 100;
    }
    void print_result(void){
        cout << "该员工为佣金员工\n姓名为:" << Name << endl;
        cout << "工号为:" << Id << endl;
        if(birthday->isbirthday())
            cout << "本月为员工生日!奖励100元!" << endl;
        cout << "工资为(底薪1100元(提高百分之十!),销售佣金为3元):" << salary << endl;
    }

    ~BasePlusCommissionEmployee() {delete this->birthday;}
};

void fn(Salary &A)
{
    A.calculate();
    A.print_result();
}

Salary& inputA(string name, string id)
{
    return *new SalariedEmployee(name, id);
}

Salary& inputB(string name, string id)
{
    return *new HourlyEmployee(name, id);
}

Salary& inputC(string name, string id)
{
    return *new CommissionEmployee(name, id);
}

Salary& inputD(string name, string id)
{
    return *new BasePlusCommissionEmployee(name, id);
}

int main()
{
    cout << "当前为一月份!" << endl;
    Salary& A = inputA("张三", "001");fn(A);
    Salary& B = inputB("李四", "002");fn(B);
    Salary& C = inputC("王五", "003");fn(C);
    Salary& D = inputD("赵六", "004");fn(D);
    delete &A; delete &B; delete &C; delete &D;
    return 0;
}

最佳答案

查看完整内容

因为我不知道应该输入些什么,对于这些输入,输出什么才是正确的 只把代码改成这样
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-6-5 22:14:11 | 显示全部楼层    本楼为最佳答案   
因为我不知道应该输入些什么,对于这些输入,输出什么才是正确的
只把代码改成这样
#include <iostream>
#include <string>

using namespace std;

class Salary{
public :
    virtual void calculate(void) = 0;
    virtual void print_result(void) = 0;
    virtual ~Salary(){};
};

class Date{
private :

public :
    int year, month, day;


    Date(): year(0), month(0), day(0) {}



    Date(int y, int m, int d) : year(y), month(m), day(d){};
    bool isbirthday(void){ return month == 1;}
    ~Date(){};
};

class SalariedEmployee : public Salary{
private :
    int salary = 4*1000;
    string Name, Id;
    Date *birthday;

public :
    SalariedEmployee(string pname, string pid){ Name = pname, Id = pid;}

    void calculate(void){
        cout << "请输入该周薪员工" << Name<<"的生日" << endl;
        cout << "请输入出生年!" << endl;



        this->birthday = new Date;




        cin >> birthday->year;
        cout << "请输入出生月!" << endl;
        cin >> birthday->month;
        cout << "请输入出生日!" << endl;
        cin >> birthday->day;
        if(birthday->isbirthday()) salary += 100;}
    void print_result(void){
        cout << "该员工为周薪员工\n姓名为:" << Name << endl;
        cout << "工号为:" << Id << endl;
        if(birthday->isbirthday())
            cout << "本月为员工生日!奖励100元!" << endl;
        cout << "工资为(固定周薪为1000元):"  << salary << endl;
    }
    //~SalariedEmployee(){delete this;}
    ~SalariedEmployee(){delete this->birthday;}
};

class HourlyEmployee : public Salary{
private :
    int salary = 0;
    string Name, Id;
    Date *birthday;
    int hour;

public :
    HourlyEmployee(string pname, string pid)
    {
        Name = pname, Id = pid;
        cout << "请输入该时薪员工" << Name<<"的生日" << endl;
        cout << "请输入出生年!" << endl;



        this->birthday = new Date;



        cin >> birthday->year;
        cout << "请输入出生月!" << endl;
        cin >> birthday->month;
        cout << "请输入出生日!" << endl;
        cin >> birthday->day;
    }

    void calculate(void){
        cout << "请输入该时薪员工" << Name<< "工作时长:";
        cin >> hour;

        if(hour <= 40)
        {
            salary = hour * 20;
        }
        else
        {
            salary = 800 + (hour - 40) * 30;
        }
        if(birthday->isbirthday()) salary += 100;
    }
    void print_result(void){
        cout << "该员工为时薪员工\n姓名为:" << Name << endl;
        cout << "工号为:" << Id << endl;
        if(birthday->isbirthday())
            cout << "本月为员工生日!奖励100元!" << endl;
        cout << "工资为(基础时薪为20元):" << salary << endl;
    }
    ~HourlyEmployee(){delete this->birthday;};
};

class CommissionEmployee : public Salary{
private :
    int salary = 0;
    string Name, Id;
    Date *birthday;
    int num;

public :
    CommissionEmployee(string pname, string pid)
    {
        Name = pname, Id = pid;
        cout << "请输入该佣金员工" << Name<<"的生日" << endl;
        cout << "请输入出生年!" << endl;


        this->birthday = new Date;


        cin >> birthday->year;
        cout << "请输入出生月!" << endl;
        cin >> birthday->month;
        cout << "请输入出生日!" << endl;
        cin >> birthday->day;
    }

    void calculate(void){
        cout << "请输入该佣金员工" << Name<<"销售数量:";
        cin >> num;
        salary = num * 5;
        if(birthday->isbirthday()) salary += 100;
    }
    void print_result(void){
        cout << "该员工为佣金员工\n姓名为:" << Name << endl;
        cout << "工号为:" << Id << endl;
        if(birthday->isbirthday())
            cout << "本月为员工生日!奖励100元!" << endl;
        cout << "工资为(销售佣金为5元):" << salary << endl;
    }

    ~CommissionEmployee() {delete this->birthday;}
};

class BasePlusCommissionEmployee : public Salary{
private :
    float salary;
    string Name, Id;
    Date *birthday;
    int num;

public :
    BasePlusCommissionEmployee(string pname, string pid)
    {
        Name = pname, Id = pid;
        cout << "请输入该带底薪佣金员工" << Name<<"的生日" << endl;
        cout << "请输入出生年!" << endl;


        this->birthday = new Date;


        cin >> birthday->year;
        cout << "请输入出生月!" << endl;
        cin >> birthday->month;
        cout << "请输入出生日!" << endl;
        cin >> birthday->day;
    }

    void calculate(void){
        cout << "请输入该带底薪佣金员工" << Name<<"销售数量:";
        cin >> num;
        salary = num * 3 + 1100;
        if(birthday->isbirthday()) salary += 100;
    }
    void print_result(void){
        cout << "该员工为佣金员工\n姓名为:" << Name << endl;
        cout << "工号为:" << Id << endl;
        if(birthday->isbirthday())
            cout << "本月为员工生日!奖励100元!" << endl;
        cout << "工资为(底薪1100元(提高百分之十!),销售佣金为3元):" << salary << endl;
    }

    ~BasePlusCommissionEmployee() {delete this->birthday;}
};

void fn(Salary &A)
{
    A.calculate();
    A.print_result();
}

Salary& inputA(string name, string id)
{
    return *new SalariedEmployee(name, id);
}

Salary& inputB(string name, string id)
{
    return *new HourlyEmployee(name, id);
}

Salary& inputC(string name, string id)
{
    return *new CommissionEmployee(name, id);
}

Salary& inputD(string name, string id)
{
    return *new BasePlusCommissionEmployee(name, id);
}

int main()
{
    cout << "当前为一月份!" << endl;
    Salary& A = inputA("张三", "001");fn(A);
    Salary& B = inputB("李四", "002");fn(B);
    Salary& C = inputC("王五", "003");fn(C);
    Salary& D = inputD("赵六", "004");fn(D);
    delete &A; delete &B; delete &C; delete &D;
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-6-5 22:24:29 | 显示全部楼层
问题1:你输入了什么?
问题2:对于这个输入,你期望输出什么才正确?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-6-5 22:30:48 | 显示全部楼层
人造人 发表于 2021-6-5 22:24
问题1:你输入了什么?
问题2:对于这个输入,你期望输出什么才正确?

1.我打算依次输入四个员工的生日,然后还有干的活算工资。
2.输出的话就是派生类里面那个print_result函数都输出出来(员工的个人信息和工资)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-6-5 22:33:57 | 显示全部楼层
eventide 发表于 2021-6-5 22:30
1.我打算依次输入四个员工的生日,然后还有干的活算工资。
2.输出的话就是派生类里面那个print_result函 ...

我要具体的输入,在这里我应该输入什么
$ ./main
当前为一月份!
请输入该周薪员工张三的生日
请输入出生年!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-6-5 22:36:58 | 显示全部楼层
人造人 发表于 2021-6-5 22:33
我要具体的输入,在这里我应该输入什么

2000 1 1依次输
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-6-5 22:41:57 | 显示全部楼层

问题1:你输入了什么?
问题2:对于这个输入,你期望输出什么才正确?

你不把输入说完整,怎么说输出?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-6-5 22:45:58 | 显示全部楼层
你不说输入和输出,我没法调试
上面的代码只是通过眼睛盯着代码看,看出的问题,并没有使用gdb进行调试,因为我不知道应该输入什么,对于这些输入,输出什么才正确
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-6-5 22:48:47 | 显示全部楼层
代码现在对了,大佬你能说下大概是什么问题吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-6-5 22:53:34 | 显示全部楼层
eventide 发表于 2021-6-5 22:48
代码现在对了,大佬你能说下大概是什么问题吗?

这样就可以了?我还没有用gdb调试呢
问题很明显的在代码中
我修改过的地方要么有注释,要么空了很多行
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-6-5 22:59:44 | 显示全部楼层
是Date类初始化的问题吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-6-5 23:00:48 | 显示全部楼层
eventide 发表于 2021-6-5 22:59
是Date类初始化的问题吗?

当然不止这一个问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-14 14:27

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表