Я пытаюсь создать программу, которая имеет personType, studentType и ProfessorType, где последние два наследуются от personType. В этой же программе у меня есть структура nodeType с переменной personType под названием «data» для хранения студентов, профессоров и людей. Затем я хочу вызвать их собственную функцию print (), а также различать guish между человеком, студентом и профессором. Я видел пример того, как сделать это здесь, но у меня есть некоторые проблемы, и я, возможно, сделал что-то не так.
Код класса и структуры:
class courseType {
public:
void setSectionID(string id);
void setCourseName(string name);
void setTitle(string tit);
void setDays(string dys);
void setTime(string tme);
void setRoom(string rm);
void setStatus(bool stat);
void setCap(int cp);
string getSectionID() const;
string getCourseName() const;
string getTitle() const;
string getDays() const;
string getTime() const;
string getRoom() const;
bool getStatus() const;
int getCap() const;
int getEnrolled() const;
static int getCensus();
bool addStudent();
void print() const;
courseType& operator= (const courseType &course);
private:
void setEnrolled(int enroll);
string sectionID;
string courseName;
string title;
string days;
string time;
string room;
bool status;
int cap;
int enrolled;
static int census;
};
class personType{
public:
personType();
personType(string first, string last, string addr, double hght, string dob, char gend);
personType(string first, string last);
personType(personType &other);
~personType();
string getFirstName() const;
string getLastName() const;
string getAddress() const;
string getDOB() const;
double getHeight() const;
char getGender() const;
void setFirstName(string first);
void setLastName(string last);
void setAddress(string addr);
void setDOB(string dob);
void setHeight(double hght);
void setGender(char gend);
virtual void print() const;
bool equals(const personType &other) const;
personType& operator= (const personType &person);
private:
char gender;
string DOB;
double height;
string address;
string fName;
string lName;
};
class studentType: public personType{
public:
studentType();
studentType(string first, string last);
studentType(string first, string last, double gpa, string classification, string id);
~studentType();
void setGPA(double gpa);
void setID(string id);
void setClassification(string classification);
void setCoursesEnrolled(int num);
double getGPA() const;
string getID() const;
string getClassification() const;
int getCoursesEnrolled() const;
void print() const;
bool equals(const studentType &other) const;
bool addCourse(courseType *course);
studentType& operator= (const studentType &student);
private:
string ID; //added every id 'should' be unique
double GPA;
string Classification;
courseType *courses[3];
int coursesEnrolled;
};
class professorType: public personType{
public:
professorType();
professorType(string first, string last);
professorType(string first, string last, string addr, double hght, string dob, char gend, string id, string depar, string deg);
~professorType();
void setEmployeeID(string id);
void setDepartment(string depar);
void setDegree(string deg);
void setCoursesTaught(int courses);
string getEmployeeID() const;
string getDepartment() const;
string getDegree() const;
int getCoursesTaught() const;
void print() const;
bool equals(const professorType &other) const;
bool assignCourse(courseType *course);
professorType& operator= (const professorType &professor);
private:
string employeeID;
string department;
string degree;
courseType *courses[5];
int coursesTaught;
};
struct nodeType{
personType data;
courseType data2;
nodeType *next;
};
const int maxInt = 2147483647;
void addCourse(int &courseCount, nodeType *&head, nodeType *&tail);
void addPersonType(int &personCount, int &studentCount, int &professorCount, nodeType *&head, nodeType *&tail);
void addStudent(int &studentCount, int &personCount, nodeType *&head, nodeType *&tail);
void addProfessor(int &professorCount, int &personCount, nodeType *&head, nodeType *&tail);
void addPerson(int &personCount, nodeType *&head, nodeType *&tail);
int lookUpStudent(int personCount, int studentCount, nodeType *head, nodeType *tail);
int lookUpProfessor(int personCount, int professorCount, nodeType *head, nodeType *tail);
int lookUpCourse(int courseCount, nodeType *head, nodeType *tail);
string makeLower(string a);
void initializeList(nodeType *& head, nodeType *&tail, int &count);
bool isEmptyList(const nodeType *head);
void printPersonList(nodeType *head);
void printCourseList(nodeType *head);
int lengthList(nodeType *head);
void destroyList(nodeType *&head, nodeType *&tail, int &count);
void insertPersonFirst(personType &newItem, nodeType *&head, nodeType *&tail, int &count);
void insertPersonLast(personType &newItem, nodeType *&head, nodeType *&tail, int &count);
void insertCourseFirst(courseType &newItem, nodeType *&head, nodeType *&tail, int &count);
void insertCourseLast(courseType &newItem, nodeType *&head, nodeType *&tail, int &count);
nodeType* getNode(nodeType *head, int count, int index);
instanceof:
template<typename Base, typename T>
inline bool instanceof(const T *ptr) {
return dynamic_cast<const Base*>(ptr) != nullptr;
}
Функции вставки и addStudent (в принципе, addProf отличное, поэтому не включено):
studentType newStudent;
newStudent.setFirstName(First);
newStudent.setLastName(Last);
newStudent.setGender(Gender);
newStudent.setDOB(DOB);
newStudent.setAddress(Address);
newStudent.setID(studentID);
newStudent.setClassification(Classification);
newStudent.setHeight(Height);
newStudent.setGPA(GPA);
insertPersonLast(newStudent, head, tail, personCount);
void insertPersonLast(personType &newItem, nodeType *&head, nodeType *&tail, int &count){
nodeType *newNode = new nodeType;
newNode->data = newItem;
newNode->next = NULL;
if (head == NULL) {
head = newNode;
tail = newNode;
}else {
tail->next = newNode;
tail = newNode;
}
count++;
}
Как проверить, является ли его studentType:
personType *holderPtr;
holderPtr = &(getNode(head, personCount, currentIndex)->data);
cout << "Arr[" << currentIndex << "] is studentType: " << instanceof<studentType>(holderPtr) << endl
Надеюсь, это имеет смысл. Сводка: у меня есть функция addStudent (), которая перечислена здесь, которая добавляет студента с помощью insertPersonLast () для вставки в список и функцию, которая просматривает связанный список, чтобы найти студентов, но с указанным выше указанием я получаю все ложный. Кроме того, при вызове моей функции печати связного списка он печатает только базовый класс print (), даже если он ученик. Любая помощь будет оценена!