2

恐怕非常具体的问题(而且我是个新手,所以提前道歉):

我目前正在尝试完成大学面向对象的 C++ 课程的期末项目。我正在创建一个学生数据库来存储学生的考试结果。我的设置有很多自定义类,但都可以正常工作(或者至少做我想让他们做的事情)。

项目设置如下:

我有所有“课程”的“主”地图,所有内容都指向该地图(因此,如果有多个学生参加课程,则不会重复课程)。

“学生”是指向“课程”的指针和相应的双“结果”的向量,我有系统中所有学生的主地图。

“学位”是一个由两个指针向量组成的类,一个指向该学位提供的课程,一个指向攻读该学位的学生。创建学位后,它会搜索两个主地图。如果课程 ID 中的前 x 个字母与学位前缀匹配,则添加该课程。如果学生的科目与课程名称匹配,则会添加该学生。

我的问题是这样的:

由于我有一些选项可以在从 CSV 文件进行初始设置后手动输入课程和学生,因此我编写了一个函数来更新我的学位,如果添加了应该包含在学位中的课程/结果(见下文)。但是,此代码不可避免地会导致第一次调用此函数时将第一个课程和学生重新添加(即重复)到第一个学位。如果再次调用该函数,则不会重复此问题。我完全不知道为什么。大量的时间和 cout 声明之后,我离解决这个问题还很遥远。我错过了关于第一次运行的明显内容吗?我可能把循环设置错了(我对地图不是很熟悉)。不要犹豫,叫我白痴!

正如我上面所说,程序的所有其余部分都是肉汁,没有这个奇怪的问题,程序很好。问题似乎也不是来自我的打印功能。

提前感谢您的宝贵时间。

//upgrade degrees function: used whenever new courses or students could be created by the user. It ticks through all stored degrees and scans cd and sd. If it finds an unstored course or student that should be stored, they are added.

void degree_database::update_degrees(course_database &cd, student_database &sd) {
    cout << "updating degrees..." << endl;

    bool found = false;
    vector<degree>::iterator current;
    for (current = start; current < end; ++current) {

            //scan course list
        map<string, course>::iterator x;
        for (x = cd.get_start(); x != cd.get_end(); ++x) {
            if (x->first.substr(0,3) == current->get_prefix().substr(0,3) || current->get_prefix() == "ALL") {

                //check to see if course is already stored
                vector<course*>::iterator a;
                for (a = current->get_c_start(); a < current->get_c_end(); ++a) {
                    if (*a == &(x->second)) {
                        found = true;
                        break;
                    }
                }

                //if found == true, then while loop broke early (i.e. the course was already stored).
                if (found == false) current->add_course(x->second);
                found = false;
            }
        }

        //scan student list
        found = false;
        map<string, student>::iterator y;
        for (y = sd.get_start(); y != sd.get_end(); ++y) {
            if (y->second.get_subject() == current->get_name() || current->get_name() == "All") {

                //check to see if course is already stored
                vector<student*>::iterator b;
                for (b = current->get_s_start(); b < current->get_s_end(); ++b) {
                    if (*b == &(y->second)) {
                        found = true;
                        break;
                    }
                }

                //if found == true, then while loop broke early (i.e. the student was already stored).
                if (found == false) current->add_student(y->second);
                found = false;
            }
        }

    }

    cout << "done." << endl; 
}
4

1 回答 1

0

course在课程列表中按值存储,然后使用指向该对象的指针进行比较。显然,您应该在地图中存储指针。我认为(*a == &(x->second)) 在第一次运行时失败,并且将课程地图中指向对象的指针添加到degree对象中。在第二次运行时,(*a == &(x->second))成功并且一切正常。student地图也一样。

于 2013-05-13T14:26:58.310 回答