簡體   English   中英

帶有標題的循環依賴項。 使用 #ifndef 和 #define

[英]Circular dependencies with headers. Using #ifndef and #define

我有以下非常簡單的代碼:

主文件

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

開始窗口.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

主窗口.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 header 中包含 #include "StartWindow.h"。 但是,我認為使用#ifndef 和#define 是為了阻止這樣的問題? 有人可以幫我解決這個問題嗎?

所謂的“標頭保護”用於防止一些不同類型的錯誤:在一個編譯單元中通過不同的間接包含多次包含相同的 header。 例如,您在 main.cpp 中包含“ah”,然后在 main.cpp 中包含“bh”,其中包含“ah”本身。

在您的情況下,兩個標題嘗試循環地相互包含,這是不可能的 - C/C++ 預處理器作為簡單的文本“復制粘貼”工作,這種情況會發明文本插入的無限遞歸。

而且我真的不明白為什么需要在“MainWindow.h”header 中包含“StartWindow.h”。

您在 MainWindow 中使用 StartWindow 嗎? 如果沒有,只需刪除 StartWindow.h 包含。 否則,使 main_window 成為指針而不是變量。

在文件 StartWindow.h 中刪除#include "MainWindow.h"並添加前向聲明(在class StartWindow...之前):

class MainWindow;

在同一個文件中,將成員MainWindow main_window更改為

const MainWindow* main_window; 

或者

const MainWindow& main_window; 

在后一種情況下,您需要在StartWindow的構造函數中傳遞const MainWindow&

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM