2011-07-04 3 views
1

を使用して、私は非常にシンプルな、次のコードを持っている:ヘッダーによる循環依存。 #ifndefのとの#define

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 

これは#include "StartWindow.h"をインクルードするためにエラーが発生します。 MainWindow.hヘッダー。しかし、私は#ifndefと#defineの使用がこのような問題を止めると考えていましたか?誰かが私のためにこれをクリアすることはできますか?

+2

正確なエラーは何ですか? 'StartWindow.h' _first_をインクルードすると、ヘッダーの最初に含まれている順番に依存していて、おそらく修正が必要なのですが、投稿したコードはOKでなければなりません(すべてのQtが正しく)。 –

答えて

3

「ヘッダーガード」と呼ばれるものは、異なるヘッダーガードと呼ばれるエラーを防ぐために使用されます。同じヘッダーを複数の間接的なインクルードで1つのコンパイル単位に含めます。たとえば、 main.cppから "a.h"をインクルードし、main.cppの "b.h"をインクルードします。その中には "a.h"自体が含まれています。

あなたのケースでは、2つのヘッダーが互いに循環的にインクルードしようとしますが、これは不可能です.C/C++プリプロセッサは単純なテキスト "コピー&ペースト"として動作し、このケースでは無限にテキスト挿入を再現します。

そして、なぜ "MainWindow.h"ヘッダに "StartWindow.h"インクルードが必要なのかわかりません。 StartWindow.hは#include "MainWindow.h"を除去し、(class StartWindow ...前に)前方宣言を追加するファイルで

+0

ああ、私はあまりにもせっかちだったし、近くの検査とテストの後、同様のコードが私のためにうまくコンパイルされていると言うことができます。ヘッダーガードは実際に適用する必要があります。 エラーメッセージを投稿できますか? –

+0

"MainWindow.h"ヘッダに "StartWindow.h"を含める理由は、MainWindowコンストラクタで渡されたStartWindowクラスへの参照としてポインタを持たせたいからです。 – nf313743

+0

MainWindow.hでStartWindowクラスのextern宣言が必要です。ヘッダは含まれません。ヘッダーガードが実際に動作するので、実際にはMainWindow.hには何も含まれません。おそらく、それはあなたのフルコードで本当の問題です。それでもエラーメッセージが役に立ちます。 –

2

MainWindowでStartWindowを使用していますか?そうでなければ、単にStartWindow.hインクルードを削除します。それ以外の場合は、main_windowを変数ではなくポインタにします。

+0

私はOPがこの明白な解決策を十分に認識していると思います。 OPはなぜ 'STARTWINDOW_H_'マクロが第2の' #include'ディレクティブが起こったときにまだ定義されていないのかを尋ねています。 –

1

class MainWindow; 

同じファイルに

const MainWindow* main_window; 

又は

const MainWindow& main_window; 
にメンバー MainWindow main_windowを変更

後者の場合、コンストラクタ内のconst MainWindow&StartWindowに渡す必要があります。