他クラスの値を取得 – プログラミング – Home

通知
すべてクリア

他クラスの値を取得


しんた
 しんた
(@しんた)
ゲスト
結合: 22年前
投稿: 48
Topic starter  

A,Bという、2クラスがありまして、
Aで、publicで、CString型で、変数testを宣言して、
クラスBで宣言した、CString型、test1に値を取得したいのですが、、

test1=A.testと書いても、初期値??を読んできて、おそらくNULLが入っている状態になっ
ています。

ちなみに、testには、そのクラス内の関数で、値は取得できるようにしてあります。
(値が入っているのも確認済みです。)

なにか、上手なソースの書き方があるのでしょうか??

ご教授ください。

環境はWin2000、MFCです。


引用解決済
トピックタグ
PAI
 PAI
(@PAI)
ゲスト
結合: 23年前
投稿: 359
 

クラスとインスタンスの関係がわかっていないご様子。
クラスを作っただけでは実体は何処にも無いです。

class A
{
public:
CString test;
};

class B
{
public:
CString test;
};

void foo(){
A a; // ←こうやって実体を作ってあげる
B b;

b.test = a.test; // A,B はクラス、a,bはインスタンス(実体)
}


返信引用
島
 島
(@島)
ゲスト
結合: 23年前
投稿: 238
 

あなたの状況を示すことが出来る最小限ので良いのでソースを示して下さい

そうでないとこちらで勝手に状況を設定してお話しなければならずお互いに
上手く伝え合う事が出来ないと思いますよ


返信引用
PAI
 PAI
(@PAI)
ゲスト
結合: 23年前
投稿: 359
 

ああ、これじゃやっぱり不定だけど、
クラスAといったとき、それは型であって実体ではないということを理解して欲しいのです。


返信引用
しんた
 しんた
(@しんた)
ゲスト
結合: 22年前
投稿: 48
Topic starter  

アドバイスありがとうございます。

すいません。
言葉足らずでした。

以下にソースの一部を乗せます。

//IPコントロールに入っている値をとります
CEdit* myED3=(CEdit*)GetDlgItem(IDC_ADDRESS_ADD);
myED3->GetWindowText(ads);

↑この操作はクラスAでの操作

上の操作が終了した後に
A pro;
address=pro.ads;
pDC->TextOut(100,100,address);

といった感じでウインドウにアドレスを表示させようとしています。しかし、アドレスに引っ張
ってこられるのは、期待した値ではありません。。。


返信引用
PAI
 PAI
(@PAI)
ゲスト
結合: 23年前
投稿: 359
 

だから、

>A pro; // ココ
>address=pro.ads;
>pDC->TextOut(100,100,address);

この部分で、Aの『新しい』インスタンスが『生成』される。
ということを理解して欲しいのですが。


返信引用
しんた
 しんた
(@しんた)
ゲスト
結合: 22年前
投稿: 48
Topic starter  

ありがとうございます。
すいません。
エラーの原因はわかりました。

で、

CEdit* myED3=(CEdit*)GetDlgItem(IDC_ADDRESS_ADD);
myED3->GetWindowText(ads);
↑ここで使われているインスタンスがわからないんですけど、
(adsがどこにはいるかがわからない)

クラス間で、共通に使えるインスタンスは、どう生成すればよいのでしょうか??


返信引用
島
 島
(@島)
ゲスト
結合: 23年前
投稿: 238
 

>//IPコントロールに入っている値をとります
>CEdit* myED3=(CEdit*)GetDlgItem(IDC_ADDRESS_ADD);
>myED3->GetWindowText(ads);
>
>↑この操作はクラスAでの操作
>
>上の操作が終了した後に
>A pro;
>address=pro.ads;
>pDC->TextOut(100,100,address);

これらの一連の関係が判るようなソースの提示の仕方は出来なんでしょうか?

A pro; 以前のクラスAのインスタンス(実体)は何処にあって、それと先ほどの
あなたのソースの「上の操作が終了した後に」との部分とのつながりはどうなって
いるのでしょうか、余りにも断片的なソースの示し方で訳(わけ)がわからない

私はあなたの状況が判る最小限とは書きましたが、お分かりですか?


返信引用
PAI
 PAI
(@PAI)
ゲスト
結合: 23年前
投稿: 359
 

親が管理するか、スタティックにするか、シングルトンにするか。
いろいろ、ケースバイケース。


返信引用
しんた
 しんた
(@しんた)
ゲスト
結合: 22年前
投稿: 48
Topic starter  

すいません。
返事遅くなりました。。。

いろいろ、アドバイスありがとうございます。。。
説明不足で申し訳ありませんでした。

私の実装したい機能は、
メインウインドウからダイアログボックスを呼び出して、
そこにある絵をダブルクリックすると、
新しいダイアログボックス(プロパティシートのようなもの)を表示させ、
そこにある、IPコントロールに入れた値を、
プロパティシートを閉じた(OKボタンを押した)と同時に
メインウインドウに表示させたいのです。

複雑な話でごめんなさい。。。

本を参考にして作ってみたのですが。。
以下に、私のソースコードをのせます。

//メインウインドウでダイアログを呼ぶ
void CMyView::OnAddMenu()
{
  CADD add;
  add.DoModal();
}
//CADDで、PROPATYのダイアログを呼ぶ。(できているので省略)

//CPROPATY上
void CPROPATY::OnOK()
{
  CEdit* myED3=(CEdit*)GetDlgItem(IDC_ADDRESS_ADD);
myED3->GetWindowText(address);
  CClientDC mydc(this);
  mydc.TextOut(100,100,address);
  CDialog::OnOK();
}

コンパイルは通るのですが、、、
どうか、ご教授ください。


返信引用
PAI
 PAI
(@PAI)
ゲスト
結合: 23年前
投稿: 359
 

現在アクティブなビューを取ってくるなら、(ダウンキャストがなんとなく嫌だけど)
AfxGetMainWnd() で、メインフレーム取ってきて、CFrameWnd*にキャストして
GetActiveView()でOK、
(だったとおもう。)
さらに目的のクラスへダウンキャストしてあげて、メンバを呼んであげればよろしいかと。

ダウンキャストが嫌いならメッセージを投げてあげるとかでなんとか。

で、どうでもいいことですが、一応重箱の隅をつつくと
MFCのドキュメントビューアーキテクチャではViewはメインウィンドウではないです。


返信引用
Wanderer
 Wanderer
(@Wanderer)
ゲスト
結合: 22年前
投稿: 35
 

> CClientDC mydc(this);

この場合の this は CPROPATY のことですよ。
PAIさんの方法で取ってきたViewクラスのポインタを入れてみてはどうで
しょうか?

ただこうやって表示してもViewが再描画されると消えるため、本来の処理
として一例を挙げると
1.Viewクラスに値を保存するメンバ変数を用意する。
2.OnDraw()にそれを表示する処理を書く
3.どこかで変数の値をセットする(この場合ダイアログになるでしょうか)
4.ViewクラスのInvalidate()を呼び出す。

とするべきかと思います。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

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