C++:子类中的交叉引用

C++: Cross reference in subclasses

本文关键字:引用 子类 C++      更新时间:2023-10-16

在以下情况下,交叉引用遇到了问题:

假设大学里有学生(学士、硕士):

大学。h

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

学生.h

#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);
};

实现如下所示:

大学.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);
}

学士生

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

硕士生.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:错误:"structStudent"的正向声明

包含在大学的文件中。cpp:3:

/magisterstudent.h:7:错误:无效使用不完整类型"struct Student"

/university.h:5:错误:"structStudent"的正向声明

这意味着在循环依赖关系的情况下,前向类声明不正确。根据大量的问答;A-forums"在头文件中转发,在cpp文件中包含"的方式是避免任何可能问题的最佳实践。那么我的代码出了什么问题?

有人(CodeFuller)假设了一个正确的答案并将其删除。为什么?

他的回答是:

单身学生继承自学生

#include "student.h"

单身学生.h的标题中

它有效。非常感谢!