尝试在另一个类中创建一个类数组

时间:2018-07-28 15:43:18

标签: c++ arrays class public

尝试使用类构建数据库。

这只是课程的摘录,我的main()使用Student类创建了一群学生。然后,每个学生都有一个ID和名称,稍后再输入。此外,每个学生将有2个席位,其中包含他们所修课程的信息。这些课程是使用课程课程创建的。

我要弄清楚的是,一旦我为他们分配了课程(即,学生A现在在第一堂课),该如何将课程信息(courseID和courseName)放入学生的课程数组的插槽中我希望将班级1的courseID和courseName分配给学生A的课程)。

我尝试使用主课程中创建的每个课程的位置,但是事实证明很难进行输出。是否可以在学生类中并从课程课程中调用函数?任何帮助都很棒。谢谢。

class Course {
protected:
    int courseID;
    char* courseName;
public:
    Course() {
        courseID = 0;
        courseName = "";
    }

    void makeID(int id, char* name) {
        courseID = id;
        courseName = name;
    }

    int getID() {
        return courseID;
    }

    char* getCourseName() {
        return courseName;
    }


};

class Student : public Course {
private:
    int studentID;
    char* studentName;
    int classCount;
    int courses[2]; //could I change to: Course courses[2]?
    char name[30];
    int id;

public:
    Student() {
        studentID = 0;
        studentName[30];
        classCount = 0;
        courses[2];
    }

    void makeStudent() {
        cout << "Input 9 digit student ID: ";
        cin >> id;
        studentID = id;
        cin.ignore();
        cout << "Input first and last name of the student: ";
        cin.getline(name, 30, '\n');
        studentName = name;
        return;
    }

    int getstudentID() {
        return studentID;
    }

    int getclassCount() {
        return classCount;
    }

    char* getstudentName() {
        return studentName;
    }

    void addClass(int course) {
        if (classCount == 2) {
            cout << "Max amount of courses reached." << endl;
        }
        else {
            courses[classCount] = course;
            classCount++;
        }
        return;
    }

    int returnClass(int course) { //can't figure out what to do 
        return courses[course];   //here. 
    }

};

1 个答案:

答案 0 :(得分:0)

首先,您应该清楚了解数据模型的外观。

好的,我们有一堆课程和一群学生。首先,课程和学生是完全无关的(除了参加课程的学生),因此,一个从另一个继承的概念是没有意义的。

想象一下,这种情况不仅涵盖一个学期(学年,学期,学期,...),课程可能会随着时间的推移以及学生的发展而改变。

因此,您可能有一个向量或另一种数据结构,一方面存储课程,另一方面存储学生。

学生将参加课程,这可以通过两种方式反映出来:

  • 所有参加课程的学生的课程清单
  • 持有所有参加课程清单的学生

根据用例,可能需要冗余地实现两者。

您将如何安装这种关系船?在两种情况下,最简单的(至少乍一看)是X持有一个或多个指向Y的指针。

openssl crl2pkcs7 -nocrl -certfile /etc/ssl/certs/ca-certificates.crt \
   | openssl pkcs7 -print_certs -noout \
   | grep -q '^issuer=/C=US/O=company/CN=localhost/OU=engineering' && echo 'Certificate found!'

由于我现在使用指针来表示关系船,因此,如果添加学生或从中删除学生,则包含所有课程和学生的数据结构都不能使它们无效! class Course { std::vector<Student*> participants; public: // whatever you need... }; class Student { std::vector<Course*> students; public: // whatever you need... }; 会这样做,因此您无法使用它。替代方案为std::vector<X>std::vector<std::unique_ptr<X>>。实际上,std::list<X>也可以使用,但是如果删除课程或学生,那么您将需要照顾删除,因此,您最好选择其他解决方案之一。

但是为什么我不对课程和学生的矢量使用智能指针呢?我们将不得不为此而使用std::vector<X*>,但我们不会从中受益:如果一名学生离开了我们的学校,我们无论如何都要消除他/他,并将他/他从参加的所有课程中删除。因此,在 this 场景中,我们不能从智能指针中受益(其他情况可能完全不同)。类似地,如果取消课程。

因此请确保在析构函数中的类

  • 一门课程会从所有学生的载体中删除,并以其自己的载体
  • 该学生已从其矢量的所有课程中取消注册

使用这些基础知识,您可以简单地通过向量中的指针来获取学生参加的特定课程的ID,名称和其他数据。

如果您经常通过特定信息(例如,按名称)进行搜索,那么您可能还会有一个std::shared_ptr,从而可以通过特定属性来进行查找。您也可以将这样的映射用于课程/学生的完整列表,但是,请注意,指针只能保证在std::map中有效,而不能在std::map<X, Y>中有效,因此如果您打算要使用后者,您将不得不像矢量std::unordered_map<X, Y>一样再次通过智能指针。