タブ内のクラスから親ウィンドウクラスへのアクセス – プログラミング – Home

タブ内のクラスから親ウィンドウクラスへ...
 
通知
すべてクリア

[解決済] タブ内のクラスから親ウィンドウクラスへのアクセス


ゆう
 ゆう
(@ゆう)
ゲスト
結合: 23年前
投稿: 114
Topic starter  

タブコントロールを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


引用未解決
トピックタグ
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

>CPage1DlgはCMainDlgのヘッダを、
>CMainDlgはCPage1Dlgのヘッダを参照しているため、
>重複定義となってしまい、コンパイルが通りません。
.h と .cpp をうまいこと分けて、参照できるようにしましょう。

○CMainDlg.h

#include Page1.h

○CPage1.h

class CMainDlg; // 追加(MainDlg.hのイクルード文は削除)

○CPage1.cpp

#include MainDlg.h // 追加

本当はそういうつくり(子供のくせに親のことを操作したりするようなつくり)はよろし
くないのですけどね。


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

訂正

>○CMainDlg.h
>○CMainDlg.h
>○CPage1.cpp
はClassWizardから作成したクラスである場合、ファイル明に、頭のCはついていません
でした。


返信引用
ゆう
 ゆう
(@ゆう)
ゲスト
結合: 23年前
投稿: 114
Topic starter  

>>Blueさん

回答ありがとうございます。
ご意見の通り変更を行ったところ、問題なく動作することが
確認できました。
ただ、自分自身「何故コンパイルが通ったのか」はっきりわかっていません。

○CPage1.h

class CMainDlg; // 追加(MainDlg.hのイクルード文は削除)

この定義を行うことによって、何が行われているのでしょうか?
いわゆる using namespace 的な機能を持っているのでしょうか?

度々申し訳ありませんが、参考となるWebサイト等でも結構ですので、
お教えして頂きたく思います。

よろしくお願いいたします。


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

http://www.sist.ac.jp/~suganuma/learn/3-bu/10-sho/10-1/10-1.htm
の最後のほうを参考にしてみてください。
(というか、探し方が不味いのかあんまりみつかんない。。。)

ポイントとしては、前送りクラス宣言したクラスは、メンバ変数としては、ポインタと
して扱っていることです。実態を持つことはできません。
(クラスのサイズ等が不明のため。ポインタならサイズは決まっている)


返信引用
ゆう
 ゆう
(@ゆう)
ゲスト
結合: 23年前
投稿: 114
Topic starter  

「前送りのクラス宣言」というものがあったんですね。
初めて知りました。

ようやく理解することができました、
わざわざ探して頂き、ありがとうございました!


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました