qt — C ++: перекрестная ссылка в подклассах

У меня проблема с перекрестными ссылками в следующей ситуации:

Предположим, что в университете есть студенты (бакалавры, магистры):

university.h

#pragma once

#include <QDebug>

class Student;

class University : public QObject
{
Q_OBJECT
public:
explicit University(QObject *parent = 0);
QList<Student*> students;
};

student.h

#pragma once

class University;

class Student : public QObject
{
Q_OBJECT
public:
explicit Student(QString name,  University *parent = 0);
};

bachelor.h

#pragma once

class Student;
class University;

class BachelorStudent : public Student
{
Q_OBJECT
public:
explicit BachelorStudent(QString name, University *parent = 0);
};

magister.h

#pragma once

class Student;
class University;

class MagisterStudent : public Student
{
Q_OBJECT
public:
explicit MagisterStudent(QString name, University *parent = 0);
};

Реализация выглядит так:

university.cpp

#include "university.h"#include "bachelorstudent.h"#include "magisterstudent.h"#include "student.h"
University::University(QObject *parent) : QObject(parent) {
students.append(new BachelorStudent("tommy", this));
students.append(new MagisterStudent("bobby", this));
qDebug() << students;
}

student.cpp

#include "student.h"#include "university.h"
Student::Student(QString name, University *parent) : QObject(parent) {
setObjectName(name);
}

bachelorstudent.cpp

#include "bachelorstudent.h"#include "student.h"#include "university.h"
BachelorStudent::BachelorStudent(QString name, University *parent) : Student(name, parent)
{}

magisterstudent.cpp

#include "magisterstudent.h"#include "student.h"#include "university.h"
MagisterStudent::MagisterStudent(QString name, University *parent) : Student(parent)
{}

… и простая основная программа:

#include <QApplication>
#include "university.h"
int main(int argc, char *argv[]) {
QApplication a(argc, argv);
new University(&a);
return a.exec();
}

К сожалению, компилятор выдает:

В файле из университета.cpp: 2:

/bachelorstudent.h:7: ошибка: недопустимое использование неполного типа ‘struct Student’

/university.h:5: ошибка: предварительное объявление ‘struct Student’

В файле из университета.cpp: 3:

/magisterstudent.h:7: ошибка: недопустимое использование неполного типа ‘struct Student’

/university.h:5: ошибка: предварительное объявление ‘struct Student’

это означает неправильное объявление класса forward в случае циклических зависимостей. По словам многих Q&А-форумы способ «пересылки в заголовках, включает в себя cpp-файлы» является наилучшей практикой, чтобы избежать любых возможных проблем. Так что не так с моим кодом?

0

Решение

Кто-то (CodeFuller) предположил правильный ответ и удалил его. Зачем?

Его ответ был:

Так далеко как BachelorStudent наследуется от Ученик, Я должен добавить

#include "student.h"

в заголовке bachelorstudent.h

Оно работает. Большое спасибо!

0

Другие решения

Других решений пока нет …