связанные списки с данными polymorphi c - PullRequest
0 голосов
/ 20 апреля 2020

Я пытаюсь создать программу, которая имеет 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 (), даже если он ученик. Любая помощь будет оценена!

1 Ответ

0 голосов
/ 21 апреля 2020

О функции print (), не вызывающей производное:

Ваша строка newNode->data = newItem; выполняет копирование по значению. Возможно, вы хотите сохранить указатель на personType, а не на экземпляр.

data не определен как указатель. Таким образом, он никогда не сможет хранить производный тип, который будет иметь большее представление, чем элемент, который будет помещен в него. Полиморфизм и копирование по значению не работают вместе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...