C++:子类中的交叉引用
C++: Cross reference in subclasses
在以下情况下,交叉引用遇到了问题:
假设大学里有学生(学士、硕士):
大学。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)假设了一个正确的答案并将其删除。为什么?
他的回答是:
就单身学生继承自学生 在单身学生.h的标题中 它有效。非常感谢!#include "student.h"
相关文章:
- 继承期间显示未知行为的子类
- 对静态分配的子类对象进行静态分配的纯虚拟父类引用是否合法?
- 是否可以在父类中引用子类
- 尝试引用子类中的抽象对象时收到编译错误
- 为什么当指向该子类的指针传递给函数时,会引用该类而不是其子类
- 引用子变量的父类
- 子类化 vtk 样式:未定义的引用
- C++引用基类中的子类指针属性
- 在C++中,如何让(嵌套)比较函子引用封闭类的数据
- 将子类实例替换为超类引用 c++
- C++:子类中的交叉引用
- 在抽象类c的子类中使用来自抽象类的引用
- 当子对象引用被分配给父对象指针时,为什么不能访问子类
- 返回子类的常量引用
- C++将类模板化为子类或引用
- 在泛型和子类代码中需要相互引用的c++类
- 如何调用一个方法,该方法需要一个子类对象,该子类对象由指向其超类的指针引用
- C++子类重载乘法运算符隐藏基重载取消引用运算符
- 子类中的成员是对父成员的引用
- 为什么我不能将超类引用强制转换为同时扩展另一个超类的子类?