[英]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.