尝试使用类构建数据库。
这只是课程的摘录,我的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.
}
};
答案 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>
一样再次通过智能指针。