与标头的循环依赖关系。使用#ifndef和#define

时间:2011-07-04 16:18:50

标签: c++

我有以下非常简单的代码:

的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来阻止这样的问题?有人可以帮我解决这个问题吗?

3 个答案:

答案 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