他クラスへの変数の移行

[戻る]
2007/01/09(火) 11:23:08
WinXP VisualStudio2005 MFCです。

初歩的な質問なのですが、
AAAView.cppクラスで宣言したint yu;

を他の新規で追加したクラス、BBB.cpp
で利用するにはどのようにすればいいんでしょうか?

BBB.cppで『yu』を利用しようとすると【定義されていない識別子です】とのエラーにな
ります。やりたい事はint yuをAAAView.cppクラスで、ある値を与え、その受け取った数
字をBBB.cppクラスで利用。

Blue 2007/01/09(火) 11:34:01
どのような関係にあるのでしょうか?

親子関係であれば、BBBクラスにAAAViewのインスタンスを渡せばいいです。
また、アプリケーション全体で使いたい変数であれば、CXXXAppクラスに持たせる方法も
あります。

Blue 2007/01/09(火) 11:38:48
追記
>やりたい事はint yuをAAAView.cppクラスで、ある値を与え、その受け取った数
>字をBBB.cppクラスで利用。
だけであれば、何らかの形でその値を渡せばいいです。
(このほうが相互参照しなくてシンプル)

引数で渡したり、

class Hoge
{
public:
    void Test(const int n) { /* ここで n を使う */ }
};

・・・
Hoge h;
h.Test(XXXX->yu);


セッターやコンストラクタをつかって、メンバ変数に値を持たせたり

class Hoge
{
    int yu;
public:
    Hoge(const int n) : yu(n) {}
    void Test();
};

・・・
Hoge h(XXXX->yu);
h.Test();

2007/01/09(火) 11:41:09
>どのような関係にあるのでしょうか?
AAA.cppクラスは実行すると画面にデータを表示するものです。
BBB.cppクラスは実行画面中にボタン押下でAAAクラスのダイアログを表示するクラスで
す。

ポインタでの受け渡しはできないのでしょうか?

Blue 2007/01/09(火) 11:48:34
>BBB.cppクラスは実行画面中にボタン押下でAAAクラスのダイアログを表示するクラスで
DoModalで表示するダイアログでしょうか?

その場合、完全にAAAが親でBBBが子である関係になります。
ですので、一般的に子が親の構造を考えてあるようなつくりはあまりよくありません。
(BBBは完全にAAAに依存する)

ですので、先のレスでも回答したとおり、必要な変数を渡して、
必要なだけ回収するようなつくりが好ましいでしょう。
(MFCのクラスでいうとCFileDialogとかはそういうつくりになっている。)


まぁ、最悪子に親のポインタを持たせるってのも仕方ないですが。

2007/01/09(火) 11:55:53
>DoModalで表示するダイアログでしょうか?
まさにそうです。

11:38のBlueさんの追記を参考に進めていきたいと思います。

Blue 2007/01/09(火) 12:01:42
ダイアログであればセッター(もしくはpublicメンバ変数)を使ったほうがわかりやすい
ですね。

class Hoge : CDialog
{
・・
private: // もしくは public:
    int yu;
publiuc:
    void SetYu(const int n) { this->yu = n; }
    int GetYu() const { return this->yu; }
・・
};

void CXXXX::OnXXXX()
{
    Hoge h;
    h.SetYu(this->yu); // h.yu = this->yu;
    h.DoModal();
    this->yu = h.GetYu(); // this->yu = h.yu;
}

2007/01/09(火) 14:10:42
似たようにしたのですが、ダイアログの中身の数字は出鱈目な数字が表示されました。
実際に自分が書いてるのは

AAAView.cppクラスで、

void CXXXX::OnXXXX()
{
    int aaa = m_datas.front()->m_yu;
    int bbb = m_datas.back()->m_ki;

    DlgXXXX dlg;
    dlg.DoModal();
}

この時、aaaに数字の1、bbbに数字の100が入っています。この二数字を次のBBB.cppの

void DlgXXXX::SetXXX()
{
    CString str;

    SetDlgItemInt(IDC_AAA, aaa);
    SetDlgItemInt(IDC_BBB, bbb);
}

aaaとbbbにそれぞれ1、100が代入されるようにしたいです。

IDC_AAAとIDC_BBBはそれぞれ数字を表示するダイアログのエディットコントロールのID
です。
これにどのように追加すれば表示されるのでしょうか?

επιστημη [HomePage] 2007/01/09(火) 14:22:10
なにがわからんのかわからんです。

class DlgXXX : public CDialog {
  int aaa, bbb;
  ...
public:
  void initialize(int a, int b) {
    aaa = a; bbb = b;
  }
  ...
};

とかやっといて、

void CXXXX::OnXXXX() {
  int aaa = m_datas.front()->m_yu;
  int bbb = m_datas.back()->m_ki;

  DlgXXXX dlg;
  dlg.initialize(aaa,bbb); // 追加
  dlg.DoModal();
}

こんだけのことちゃいます?

2007/01/09(火) 14:39:02
[[解決]]
επιστημηさん、無事解決しました。
どうやら自分はまだここで質問できるレベルではないようです。
もう少し基本から勉強していきたいと思います。

受け渡し方等がわかりませんでした。Blueさんもありがとうございました。

たいちう 2007/01/09(火) 15:00:48
まだ読んでくれるかな?

> どうやら自分はまだここで質問できるレベルではないようです。
> もう少し基本から勉強していきたいと思います。

前回の質問も併せて読んだ感想だと、
もう少し基本から勉強というのには賛成ですが、
プログラミングのレベルが低いからといって
質問が敬遠されるようなことは、この掲示板では見られません。
遠慮なく質問すれば良いと思います。

一方、質問の仕方については、この掲示板に限りませんが、
厳しいレスが付くことがあります。
質問者にしか知るすべのない情報が、
うまく説明できていない場合などです。

質問者:○○がわかりません。
回答者:そんな質問じゃ、何をしたいのかわからないよ
質問者:わからないから質問しているのに...

↑こんな感じです。

多くの回答者は、曖昧な質問に対しても、
ある程度の推測をして答えてくれますが、
質問する人も、自分の質問(=抱えている問題)を
客観的に説明する努力をするのが良いでしょう。

有効な回答が得られやすくなるのはもちろん、
客観的に問題を捉えることができれば、
確実にスキル向上に役立ちます。

2007/01/09(火) 17:21:04
>まだ読んでくれるかな?
勿論読ませてもらいました。

>質問が敬遠されるようなことは、この掲示板では見られません。
>遠慮なく質問すれば良いと思います。
今後は自分が何をしているのか、何がわからないのか理解できている時に質問したいと
は思っています。

>一方、質問の仕方については、この掲示板に限りませんが、
>厳しいレスが付くことがあります。
>質問者にしか知るすべのない情報が、
>うまく説明できていない場合などです。
それについてはここでの質問の経験上理解しています。
VC++の質問に限らず、普段でも言える事なので情報は多く提供して回答者に協力した
いです。

>有効な回答が得られやすくなるのはもちろん、
>客観的に問題を捉えることができれば、
>確実にスキル向上に役立ちます。
質問をやめるのではなく上手に利用して学習の役に立てていきたいです。

ありがとうございました。

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