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

Posted

技术标签:

【中文标题】C++:子类中的交叉引用【英文标题】:C++: Cross reference in subclasses 【发布时间】:2016-04-02 08:36:52 【问题描述】:

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

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

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

单身汉.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);
;

实现如下所示:

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

单身汉.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();

不幸的是编译器抛出:

在来自 university.cpp:2 的文件中:

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

/university.h:5: 错误:'struct Student' 的前向声明

在来自 university.cpp:3 的文件中:

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

/university.h:5: 错误:'struct Student' 的前向声明

这意味着在循环依赖的情况下不正确的前向类声明。根据许多问答论坛,“在标题中转发,包含在 cpp 文件中”的方式是避免任何可能问题的最佳实践。那么我的代码有什么问题呢?

【问题讨论】:

哪个编译单元有这个错误?是否需要不同的Student 子类来证明问题? 【参考方案1】:

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

他的回答是:

至于BachelorStudent继承自Student,我必须补充

#include "student.h"

bachelorstudent.h

的标题中

它有效。非常感谢!

【讨论】:

以上是关于C++:子类中的交叉引用的主要内容,如果未能解决你的问题,请参考以下文章

C++多态总结

C++多态总结

c++中 static 变量和函数能否被子类继承

数据仓库中的交叉引用事实和维度

SQL Server:交叉引用一个表中的多个列与另一个表中的多个列

c++虚类、子类和自引用