我有以下非常简单的代码:
的main.cpp
#include "ui_library_browser.h"
#include <QtGui/QApplication>
#include "StartWindow.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
StartWindow w;
w.show();
return a.exec();
}
StartWindow.h
#ifndef STARTWINDOW_H_
#define STARTWINDOW_H_
#include <qwidget>
#include "MainWindow.h"
class StartWindow : public QWidget
{
Q_OBJECT
public:
StartWindow();
~StartWindow();
MainWindow main_window; //<-- Problem
};
#endif
MainWindow.h
#ifndef MAINWINDOW_H_
#define MAINWINDOW_H_
#include <qdialog.h>
#include "StartWindow.h"
class MainWindow : public QDialog
{
Q_OBJECT
public:
MainWindow();
~MainWindow();
};
#endif
由于在MainWindow.h头文件中包含#include“StartWindow.h”,因此会产生错误。但是,我认为使用#ifndef和#define来阻止这样的问题?有人可以帮我解决这个问题吗?
答案 0 :(得分:4)
所谓的“标题保护”用于防止一种不同类型的错误:在一个编译单元中通过不同的间接包含多次包括相同的标题。例如, 你从main.cpp中包含“a.h”,然后在main.cpp中包含“b.h”,其中包含“a.h”本身。
在你的情况下,两个标题试图相互包含,这是不可能的 - C / C ++预处理器作为简单的文本“复制 - 粘贴”工作,这种情况下会发明无限的文本插入递归。
我真的不明白为什么你需要在“MainWindow.h”标题中包含“StartWindow.h”。
答案 1 :(得分:2)
你在MainWindow中使用StartWindow吗?如果没有,只需删除StartWindow.h include。否则,使main_window成为指针而不是变量。
答案 2 :(得分:1)
在文件StartWindow.h中删除#include "MainWindow.h"
并添加前向声明(在class StartWindow ...
之前):
class MainWindow;
在同一文件中,将成员MainWindow main_window
更改为
const MainWindow* main_window;
或
const MainWindow& main_window;
在后一种情况下,您需要在const MainWindow&
的构造函数中传递StartWindow
。