У меня проблема с перекрестными ссылками в следующей ситуации:
Предположим, что в университете есть студенты (бакалавры, магистры):
#pragma once
#include <QDebug>
class Student;
class University : public QObject
{
Q_OBJECT
public:
explicit University(QObject *parent = 0);
QList<Student*> students;
};
#pragma once
class University;
class Student : public QObject
{
Q_OBJECT
public:
explicit Student(QString name, University *parent = 0);
};
#pragma once
class Student;
class University;
class BachelorStudent : public Student
{
Q_OBJECT
public:
explicit BachelorStudent(QString name, University *parent = 0);
};
#pragma once
class Student;
class University;
class MagisterStudent : public Student
{
Q_OBJECT
public:
explicit MagisterStudent(QString name, University *parent = 0);
};
Реализация выглядит так:
#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;
}
#include "student.h"#include "university.h"
Student::Student(QString name, University *parent) : QObject(parent) {
setObjectName(name);
}
#include "bachelorstudent.h"#include "student.h"#include "university.h"
BachelorStudent::BachelorStudent(QString name, University *parent) : Student(name, parent)
{}
#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-файлы» является наилучшей практикой, чтобы избежать любых возможных проблем. Так что не так с моим кодом?
Кто-то (CodeFuller) предположил правильный ответ и удалил его. Зачем?
Его ответ был:
Так далеко как BachelorStudent наследуется от Ученик, Я должен добавить
#include "student.h"
в заголовке bachelorstudent.h
Оно работает. Большое спасибо!
Других решений пока нет …