他のクラスのメンバ変数に値を代入

[戻る]
gots 2002/11/22(金) 16:48:30
<VC++, MFC>

あるクラスで、他のクラスのメンバ変数に値を代入するにはどうすればよいのでしょうか??

例えば。。。

class CMainDlg : public CDialog   // Mainダイアログ
と
class CSubDlg : public CDialog    // Subダイアログ
があって、

CMainDlg::OnInitDialog() で 
 CSubDlg Dlg;
 Dlg.DoModal();
で、Subダイアログを呼んでいます。
ここで、EditBoxに値を入力させて、その値を、
CSubDlg::OnOK() の中で CMainDlg のメンバ変数に格納したいのです。

すごい初歩的な質問だと思いますが、ご教授お願いいたします。

YuO [E-Mail] 2002/11/22(金) 17:02:08
CSubDlgの構築子か何かでCMainDlgのインスタンスへのポインタやリファレンスを渡しておけば,
CSubDlg::OnOKでCMainDlgのインスタンスを扱えます。
ex)
class CMainDlg;
class CSubDlg : public CDialog {
    CMainDlg & MainDlg_;

public:
    CSubDlg (CMainDlg &);
};

// 実装
CSubDlg::CSubDlg (CMainDlg & MainDlg) : CDialog(), MainDlg_(MainDlg)
{
    /* ... */
}

// 利用
    CSubDlg Dlg(*this); // thisはCMainDlg * const
    Dlg.DoModal();


> すごい初歩的な質問だと思いますが、

この言葉は不要です。
「初歩的だと思うなら自分で調べろ」という言葉が返ってくる元になります。

dairygoods 2002/11/22(金) 17:02:41
こちらでいろいろな方法が挙がっています。
http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200211/02110036.txt

ただ、この場合、CSubDlg::OnOK()からCMainDlgの変数に設定するのではなく、
CMainDlgの方が、CSubDlgのメンバ変数を取って来る方が簡単だと思いますが。

 CSubDlg Dlg;
 if (Dlg.DoModal()==IDOK) {
    m_data = Dlg.m_data;
  }

gots 2002/11/25(月) 14:40:47
YuOさま
ありがとうございます。できました。
が、この部分の意味が理解できていないので、ご教授いただけると幸いです。
CSubDlg::CSubDlg (CMainDlg & MainDlg) : CDialog(), MainDlg_(MainDlg)

dairygoodsさま
過去ログにあったんですね。ありがとうございます。
現在メンバ変数で取ってくる方法でやっていて、あとAppクラスに持つのというのも
考えましたができれば違うやり方が知りたかったんです。
言葉が足りませんでしたね。例がダイアログだったからいけなかったですかね。
普通のクラスの間での参照の仕方も合わせて知りたかったので。。。

クラスだからと妙にむずかしく考えていましたが、ようは関数のポインタ渡しと
同じコト、ということなのでしょうか。

PAI 2002/11/25(月) 20:22:01
横レス失礼

>CSubDlg::CSubDlg (CMainDlg & MainDlg) : CDialog(), MainDlg_(MainDlg)

CSubDlg のコンストラクタで、
明示的に CDialog のコンストラクタを呼び、MainDlg_ を MainDlgで初期化する。
という意味。

「コンストラクタ初期化子」とか「初期化リスト」とかいいます。

gots 2002/11/26(火) 14:00:28
[[解決]]
PAI さま
ありがとうございました。「初期化リスト」なんか聞いた(見た)ことあります。
その辺で検索かけて、もうちょっと自分で調べてみます。

古いスレッドには追加発言できません。