c++ 构造两个具有属性并且可以使用彼此的方法的类

hlswsv35  于 2022-12-24  发布在  其他
关注(0)|答案(1)|浏览(121)

我想知道两个类有没有可能拥有属性,并且可以使用彼此的方法。例如,有一个类STUDENT和一个类COURSE,STUDENT有一个已加入课程的列表,而COURSE有一个参与者(学生)的列表。我尝试了以下方法:
学生.h

#include <iostream>
#include <vector>
// #include "COURSE.h"

class COURSE;

class STUDENT {
    string name;
    std::vector<COURSE*> listCourses;
public:
    STUDENT(){};

    addCourse(COURSE* &course){
        listCourses.push_back(course);
        course.addStudent(this);
    }
    
    string getName(){
       return this->name;
    }
    
    void showCourses(){
       for(COURSE* course : listCourses)
          std::cout << course->getName() << std::endl;
    }
};

过程中。h

#include <iostream>
#include <vector>
// #include "STUDENT.h"

class STUDENT;

class COURSE {
    string name;
    std::vector<STUDENT*> listStudents;
public:
    COURSE(){}

    addStudent(STUDENT* &student){
        listStudents.push_back(student);
        student.addCourse(this);
    }
      
    string getName(){
       return this->name;
    }
    
    void showStudent(){
       for(STUDENT* student : listCourses)
          std::cout << student->getName() << std::endl;
    }

};

如果我包含两个类,它说错误。如果我只包含一个,只有一个类工作,其他类有问题。
有人能帮我解决这个问题吗?我想知道是否有必要使用一些设计模式或数据结构来解决这个问题。谢谢

sqxo8psd

sqxo8psd1#

是的,你所尝试的是可能的,但不是以你所尝试的方式。你需要把你的方法声明和定义分开。
此外,您的add...方法中存在一个缺陷,一旦Student添加到Course,就会导致无限递归,反之亦然。您需要检测这两个函数何时已经链接在一起,以便避免循环。
试试这样的方法:
Student.h

#ifndef StudentH
#define StudentH

#include <vector>
#include <string>

class Course;

class Student {
    std::string name;
    std::vector<Course*> listCourses;
public:
    Student() = default;
    ~Student();

    std::string getName() const;

    void addCourse(Course* course);
    void removeCourse(Course* course);
    void showCourses() const;
};

#endif

Student.cpp

#include "Student.h"
#include "Course.h"

#include <iostream>
#include <algorithm>

Student::~Student() {
    for(Course* course : listCourses) {
        course->removeStudent(this);
    }
}

std::string Student::getName() const {
    return name;
}

void Student::addCourse(Course* course) {
    if (std::find(listCourses.begin(), listCourses.end(), course) == listCourses.end()) {
        listCourses.push_back(course);
        course->addStudent(this);
    }
}
    
void Student::removeCourse(Course* course) {
    auto iter = std::find(listCourses.begin(), listCourses.end(), course);
    if (iter != listCourses.end()) {
        listCourses.erase(iter);
        course->removeStudent(this);
    }
}
    
void Student::showCourses() const {
    for(Course* course : listCourses) {
        std::cout << course->getName() << std::endl;
    }
}

Course.h

#ifndef CourseH
#define CourseH

#include <vector>
#include <string>

class Student;

class Course {
    std::string name;
    std::vector<Student*> listStudents;
public:
    Course() = default;
    ~Course();

    std::string getName() const;

    void addStudent(Student* student);
    void removeStudent(Student* student);
    void showStudents() const;
};

#endif

Course.cpp

#include "Course.h"
#include "Student.h"

#include <iostream>
#include <algorithm>

Course::~Course() {
    for(Student* student : listStudents) {
        student->removeCourse(this);
    }
}

std::string Course::getName() const {
    return name;
}

void Course::addStudent(Student* student) {
    if (std::find(listStudents.begin(), listStudents.end(), student) == listStudents.end()) {
        listStudents.push_back(student);
        student->addCourse(this);
    }
}
      
void Course::removeStudent(Student* student) {
    auto iter = std::find(listStudents.begin(), listStudents.end(), student);
    if (iter != listStudents.end()) {
        listStudents.erase(iter);
        student->removeCourse(this);
    }
}
    
void Course::showStudents() const {
    for(Student* student : listStudents) {
        std::cout << student->getName() << std::endl;
    }
}

相关问题