qq_41030359
漫道长歌行
采纳率0%
2018-04-06 10:19

c++编译通过,调试却出现了错误,看了好多遍还是找不出错误~

20

小白这次的c++程序是要实现多重继承,虚函数等功能的一个学校人员管理系统。

系统要求由一个基类继承出学生类和老师类,再由学生类和老师类共同继承出在读教
师类和在职研究生类。学生类和老师类继承基类时,基类是虚基类。
小白先写了基类和教师类然后先试一番,生成解决方案没有出现错误,但是“执行(不调试)”之后,出现黑色的执行窗口,前面立马出现一个框框,上面写着”my6/*我滴文件名*/ .exe已经停止工作,由于出现问题,程序停止正常工作。windows将关闭程序,并会在有可用的解决方案时通知你“。图片说明
小白上百度搜,度娘说,可能时堆栈溢出,或者内存使用不当等问题,可是小白不太懂这些,前前后后看了几遍代码,修来修去,还是不能,还有噢,vs我用了“开始调试”后出现了这样的情况图片说明

求大佬大神们帮助!~~
以下就是我哒程序~~

#include<iostream>
using namespace std;
#include<string>
#define N 20
int nt = 0;
class person
{
protected:
    string name;
    char sex;
    int age;
public:
    person(string n = '\0', char s = '\0', int a = 0) { name = n; sex = s; age = a; }
    virtual void set() = 0;
    virtual void input(int) = 0;
    virtual void display() = 0;
    virtual void add() = 0;
    virtual void search() = 0;
    virtual void find(string) = 0;
    virtual void find(int) = 0;
    virtual void find(string, int[]) = 0;
    virtual void find(int, int[]) = 0;
    virtual void choosehowmodify() = 0;
    virtual void modify(int[]) = 0;
};

class teacher :virtual public person
{
private:
    string zhicheng;
    int gongzi;
public:
    int gonghao;
    teacher(string n = "teacher", char s = '\0', int a = 0, int gh = 0, string z = '\0', int gz = 0) :person(n, s, a) { gonghao = gh; zhicheng = z; gongzi = gz; }
    void set();
    void input(int);
    void display();
    void add();
    void search();
    void find(string);
    void find(int);
    void find(string, int[]);
    void find(int, int[]);
    void choosehowmodify();
    void modify(int[]);
    friend ostream & operator<<(ostream &output, const teacher &t);
}tea[N];

void teacher::set()
{
    cout << "创建教师人数:";
    cin >> nt;
    if (nt <= N)
    {
        int i;
        for (i = 0; i < nt; i++)
        {
            tea[i].input(i);
        }
    }
    else cout << "超出容量!最多输入" << N << "人!" << endl << "请重新输入创建人数:";
}

void teacher::input(int i)
{
    cout << "请输入第" << i + 1 << "名教师的信息:" << endl;
    cout << "姓名:";
    cin >> name;
    cout << "性别:";
    cin >> sex;
    cout << "年龄:";
    cin >> age;
    cout << "职称:";
    cin >> zhicheng;
    cout << "工资:";
    cin >> gongzi;
    cout << "工号:";
    cin >> gonghao;
}

ostream & operator<<(ostream &output, const teacher &t)
{
    output << "姓名:" << t.name << endl << "性别:" << t.age << endl << "年龄:" << t.sex << endl << "职称:" << t.zhicheng << endl << "工资:" << t.gongzi << endl << "工号:" << t.gonghao << endl;
    return output;
}

void teacher::display()
{
    int i;
    cout << "显示教师信息:";
    for (i = 0; i < nt; i++)
    {
        cout << tea[i];
    }
}

void teacher::add()
{
    cout << "添加教师人数:";
    int temp;
    cin >> temp;
    if (nt + temp <= N)
    {
        int i;
        for (i = nt; i < nt + temp; i++)
        {
            tea[i].input(i);
            nt++;
        }
    }
    else cout << "超出容量!最多再输入" << N - nt << "人!" << endl << "请重新输入添加人数:";
}

void teacher::search()
{
    bool pan = true;
    while (pan)
    {
        pan = false;
        cout << "1.姓名:" << endl << "2.工号:" << endl;
        cout << "查询教师信息,请选择查询途径:";
        int x;
        cin >> x;
        if (x == 1 || x == 2)
        {
            switch (x)
            {
            case 1:
            {
                cout << "输入姓名:";
                string nam;
                cin >> nam;
                find(nam);
                break;
            }
            case 2:
            {
                cout << "输入工号:";
                int gh;
                cin >> gh;
                find(gh);
                break;
            }
            }
            cout << "输入y继续查询,输入n则退回教师信息操作菜单,请选择:";
            char y;
            cin >> y;
            if (y == 'y')
                pan = true;
        }
        else
        {
            cout << "输入的选择无效,请输入1或2!";
            pan = true;
        }
    }
}

void teacher::find(string nam)
{
    int i;
    for (i = 0; i < nt; i++)
    {
        if (nam == tea[i].name)
        {
            cout << tea[i];
        }
    }
}

void teacher::find(int gh)
{
    int i;
    for (i = 0; i < nt; i++)
    {
        if (gh == tea[i].gonghao)
            cout << tea[i];
    }
}

void teacher::find(string nam, int list[])
{
    int i, j = 0;
    for (i = 0; i < nt; i++)
    {
        if (nam == tea[i].name)
        {
            list[j] = i;
            j++;
        }
    }
}

void teacher::find(int gh, int list[])
{
    int i, j = 0;
    for (i = 0; i < nt; i++)
    {
        if (gh == tea[i].gonghao)
        {
            list[j] = i;
            j++;
        }
    }
}

void teacher::choosehowmodify()
{
    bool pan = true;
    while (pan)
    {
        pan = false;
        cout << "1.姓名:" << endl << "2.工号:" << endl;
        cout << "修改教师信息,请选择寻修改途径:";
        int x;
        cin >> x;
        if (x == 1 || x == 2)
        {
            switch (x)
            {
            case 1:
            {
                cout << "输入姓名:";
                string nam;
                cin >> nam;
                int list[N] = { 0 };
                find(nam, list);
                modify(list);
                break;
            }
            case 2:
            {
                cout << "输入工号:";
                int gh;
                cin >> gh;
                int list[N] = { 0 };
                find(gh, list);
                modify(list);
                break;
            }
            }
            cout << "输入y继续修改,输入n则退回教师信息操作菜单,请选择:";
            char y;
            cin >> y;
            if (y == 'y')
                pan = true;
        }
        else
        {
            cout << "输入的选择无效,请输入1或2!";
            pan = true;
        }
    }
}

void teacher::modify(int list[])
{
    int i;
    for (i = 0; list[i] != 0; i++)
    {
        bool pan = true;
        while (pan)
        {
            pan = false;
            cout << tea[list[i]] << endl;
            cout << "1.姓名:" << endl << "2.性别:" << endl << "3.年龄:" << endl << "4.职称:" << endl << "5.工资:" << endl << "6.工号:" << endl;
            cout << "请输入欲修改的信息序号:";
            int z;
            cin >> z;
            switch (z)
            {
            case 1:
            {
                cout << "请输入新姓名:";
                cin >> tea[list[i]].name;
                break;
            }
            case 2:
            {
                cout << "请输入新性别:";
                cin >> tea[list[i]].sex;
                break;
            }
            case 3:
            {
                cout << "请输入新年龄:";
                cin >> tea[list[i]].age;
                break;
            }
            case 4:
            {
                cout << "请输入新职称:";
                cin >> tea[list[i]].zhicheng;
                break;
            }
            case 5:
            {
                cout << "请输入新工资:";
                cin >> tea[list[i]].gongzi;
                break;
            }
            case 6:
            {cout << "请输入新工号:";
            cin >> tea[list[i]].gonghao;
            break;
            }
            }
            cout << "输入y继续修改该教师,输入n则进入下一步:";
            char x;
            cin >> x;
            if (x == 'y')
                pan = true;
        }
    }
}

int main()
{
    void choosefunction(person*);
    person *pt;
    bool pan = true;
    while (pan)
    {
        cout << "**类选择菜单**" << "1.教师" << endl << "2.学生" << endl << "3.在职研究生" << endl << "4.在读教师" << endl << endl << "请选择:";
        char x;
        cin >> x;
        switch (x)
        {
        case 1:pt = tea; choosefunction(pt); break;
        case 2:cout << "敬请期待!"; break;
        }
        cout << "输入y则继续对“类选择菜单”进行操作,输入n则退出程序,请选择:";
        char y;
        cin >> y;
        if (y == 'y')
            pan = true;
        else
            pan = false;
    }
    return 0;
}

void choosefunction(person *pt)
{
    bool pan = true;
    while (pan)
    {
        cout << "a.创建" << endl << "b.显示" << endl << "c.添加" << endl << "d.查询" << endl << "e.修改" << endl << "请选择:" << endl;
        char x;
        cin >> x;
        switch (x)
        {
        case 'a':pt->set(); break;
        case 'b':pt->display(); break;
        case 'c':pt->add(); break;
        case 'd':pt->search(); break;
        case 'e':pt->choosehowmodify(); break;
        }
        cout << "输入y则继续对该类进行操作,输入n则退回“类选择菜单”,请选择:";
        char y;
        cin >> y;
        if (y == 'y')
            pan = true;
        else
            pan = false;
    }

}

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答

10条回答

  • abc2306 abc2306 3年前

    应该是内存问题,慢慢调试吧

    点赞 2 评论 复制链接分享
  • SecretGarden SecretGarden 3年前

    这种比较基础的问题呢,还是需要自己去学会调试的,一步一步,逐行代码调试,不然总有问不完的问题。

    单从你的异常信息来看,应该是空指针引起的,具体来说,就是 _First 指针为 NULL,具体原因你得单步调试一下。

    点赞 2 评论 复制链接分享
  • zouxuxiao zzzzzdasffdaf 3年前

    string n = '\0'改为双引号

    点赞 1 评论 复制链接分享
  • qq_38375538 qq_38375538 3年前

    内存错误,一行行注释掉,慢慢找吧

    点赞 1 评论 复制链接分享
  • qq_37939251 多纤果冻 3年前

    不懂。。我是做java的

    点赞 1 评论 复制链接分享
  • wangdongyue100 wangdongyue100 3年前

    这个问题可以试试单步调试,
    1.要么数组越界;
    2.要么操作了为null的指针。
    一步一步打断点就可以确定错误在哪。

    点赞 评论 复制链接分享
  • xhsyx Geoffrey Syu 3年前

    单步调试一下找错误,或者重新建一个工程,将你的源文件和头文件下的.h和.cpp复制过去,打开主程序重新编译!

    点赞 评论 复制链接分享
  • zdc71913 zdc71913 3年前

    单步调试看哪里出现问题试试

    点赞 评论 复制链接分享
  • m0_37866832 m0_37866832 3年前

    若编译通过,用开始执行(不调试)即ctrl+f5就可。

    点赞 评论 复制链接分享
  • zckui zckui 3年前

    访问权限的问题,person类中的成员变量不应该为protected,你改为public试试

    点赞 评论 复制链接分享