• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:Windowsフォームの表示)

Windowsフォームの表示

このQ&Aのポイント
  • Visual C++ 2005(Express Edition)を使用して、Windowsフォームを表示する方法について教えてください。
  • Form1.h、Form2.h、Form3.hの3つのフォームを作成し、ボタンをクリックすると別のフォームが表示されるようにしたいです。
  • しかし、Form2とForm3は名前空間に存在しないというエラーが発生します。正しい書き方を教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

おそらく、メインとなる sample.cpp のコンパイルはうまくいくかもしれませんが、Form2 と Form3 の追加時に一緒にプロジェクトに追加される Form2.cpp, Form3.cpp のコンパイルに失敗しているのではないでしょうか。 このソースの問題点は、Form1.h, Form2.h, Form3.h がそれぞれ相互に #include をしている点です。 それぞれのヘッダファイルには多重インクルードを防止する #pragma once が含まれており、いったん読まれたファイルは2度目は無視する、というようになっています。 Form2.cpp には(プリコンパイル済みヘッダの stdafx.h を除けば) #include "Form2.h" のみが記載されていると思いますが、コンパイル時にどのように解析されていくかを辿ってみましょう。 まず、Form2.h の中が参照されます。この中ではさらに先頭に #include "Form1.h" が書かれているので、(Form2クラスの定義を見るよりも前に) Form1.h を読みに行きます。Form1.h では先頭で再び #include "Form2.h" が記載されていますが、Form2.h はすでに読み込まれている(より正確には、読み込みを開始している)ので #pragma once の効果により無視されます。次に #include "Form3" が書かれているので Form3.h を読みに行きます。Form3.h の先頭でまたまた #include "Form1.h" #include "Form2.h" が書かれていますが、どちらも読み込み開始しているので無視されます。その後、最初のクラス定義である class Form3 {...}; を読みます。Form3の読み込みが完了すると、Form1.h の中の 「#include "Form3.h"」直後から読み込み再開し、(まだForm2クラスの定義が出現していない状態で) class Form1 {...}; を読むことになります。この中で、まだ定義されていない Form2 を使用するため、コンパイルエラーとなります。 解決方法としては、ヘッダファイルの相互参照を無くすことです。今回の場合、Form1.h からは Form2.h のみをインクルードし、Form2.h からは Form3.h のみをインクルードするようにします。

marsha110
質問者

お礼

回答ありがとうございます。 fresh homepieさんの方法でやりましたら成功しました。 ヘッダーファイルの事も詳しく説明されていて、こちらの方も、新たな知識を得たと感じています。 私は、独学でVc++プログラミングをやっています。 こういうかゆい点まで説明している、VC++の本がほとんど無くて、困っています。