タブコントロールをCMainDlgに貼り付け、
その上にCPage1Dlg,CPage2Dlg等を表示しています。
このとき、親ウィンドウのヘッダで、
#include Page1.h
#include Page2.h
~中略~
CPage1 m_Page1;
CPage2 m_Page2;
と定義して、OnSelchangeTabイベント内でのタブ切替等を行っています。
ここからが本題なのですが、
CPage1クラス、またはCPage2クラスから、親ウィンドウのクラスメンバにアクセスする
際、
// 親ウィンドウハンドルのセット
void CPage1::SetParent(CWnd* pParent)
{
m_pParent = pParent;
}
上記の様な関数を定義し、
((CMainDlg *)m_pParent)->m_DataId;
のようにアクセスしているのですが、コードが長い&見にくいため、
CPage1のクラスメンバとして
CMainDlg *m_pParent;
として親ウィンドウハンドル取得用の変数を定義し、
m_pParent = (CMainDlg *)pParent;
としてやりたいのですが、
CPage1DlgはCMainDlgのヘッダを、
CMainDlgはCPage1Dlgのヘッダを参照しているため、
重複定義となってしまい、コンパイルが通りません。
どうしたらよいでしょうか。
VC6.0 MFC WindowsXP
>CPage1DlgはCMainDlgのヘッダを、
>CMainDlgはCPage1Dlgのヘッダを参照しているため、
>重複定義となってしまい、コンパイルが通りません。
.h と .cpp をうまいこと分けて、参照できるようにしましょう。
○CMainDlg.h
#include Page1.h
○CPage1.h
class CMainDlg; // 追加(MainDlg.hのイクルード文は削除)
○CPage1.cpp
#include MainDlg.h // 追加
本当はそういうつくり(子供のくせに親のことを操作したりするようなつくり)はよろし
くないのですけどね。
訂正
>○CMainDlg.h
>○CMainDlg.h
>○CPage1.cpp
はClassWizardから作成したクラスである場合、ファイル明に、頭のCはついていません
でした。
>>Blueさん
回答ありがとうございます。
ご意見の通り変更を行ったところ、問題なく動作することが
確認できました。
ただ、自分自身「何故コンパイルが通ったのか」はっきりわかっていません。
○CPage1.h
class CMainDlg; // 追加(MainDlg.hのイクルード文は削除)
この定義を行うことによって、何が行われているのでしょうか?
いわゆる using namespace 的な機能を持っているのでしょうか?
度々申し訳ありませんが、参考となるWebサイト等でも結構ですので、
お教えして頂きたく思います。
よろしくお願いいたします。
http://www.sist.ac.jp/~suganuma/learn/3-bu/10-sho/10-1/10-1.htm
の最後のほうを参考にしてみてください。
(というか、探し方が不味いのかあんまりみつかんない。。。)
ポイントとしては、前送りクラス宣言したクラスは、メンバ変数としては、ポインタと
して扱っていることです。実態を持つことはできません。
(クラスのサイズ等が不明のため。ポインタならサイズは決まっている)
「前送りのクラス宣言」というものがあったんですね。
初めて知りました。
ようやく理解することができました、
わざわざ探して頂き、ありがとうございました!