Проблема с прототипированием классов в C ++ - PullRequest
0 голосов
/ 19 ноября 2018

В основном мой код состоит из 2 классов:

class teacher { 
    //has object of class course
};
class course { 
    //has object of class teacher
};

Это не сработало, так как учитель не смог получить доступ к учебному курсу, потому что он написан после учителя.Тогда я попытался создать прототипы классов.

class teacher;
class course;
.....
class teacher {
    //object of class course
};
class course {
    //object of class teacher
};

Все еще не работает.И да, мне нужны эти классы для хранения объектов друг друга.Пожалуйста, скажите мне, что это может работать так, как я хочу, и мне не нужно менять свой код.Был бы очень признателен за помощь.Спасибо.

Ответы [ 2 ]

0 голосов
/ 19 ноября 2018

Я думаю, вы должны рассматривать это как проблему с базой данных.
Давайте создадим еще одну таблицу, содержащую учителей и курсы:

class Teacher_Course
{
  Teacher t;
  Course c;
}

Таблица может быть представлена ​​в виде:

std::vector<Teacher_Course> tc_table;

Изображение будет выглядеть следующим образом:

+---------+----------+  
| Teacher | Course   |  
+---------+----------+  
| Schults | Math 1   |  
+---------+----------+  
| Schults | Calculus |  
+---------+----------+  
| Jonez   | History1 |
+---------+----------+  

Эта схема позволяет вашим Teacher и Course классам быть независимыми.Отношение моделируется классом Teacher_Course.

Таким образом устраняются все циклические зависимости между Teacher и Course.

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

0 голосов
/ 19 ноября 2018

Код, который работает для того, что вы, вероятно, хотите сделать:

teacher.h

#include <vector>
using std::vector;
class Course;

class Teacher
{
vector<Course*> courses;
...
};

course.h

#include <vector>
using std::vector;
class Teacher;

class Course
{
vector<Teachers*> teachers;
...
};

Обратите внимание, что в исходных файлах, вы захотите включить оба заголовочных файла, так как сейчас Teacher не знает функциональности Course и наоборот.

Я сделал это с помощью необработанных указателей, чтобы вам было легче понять,но в какой-то момент вам следует переключиться на какие-то умные указатели (в данном случае, вероятно, weak_ptr).

Кстати, обычно пишутся имена классов с большими первыми буквами.

...