A,Bという、2クラスがありまして、
Aで、publicで、CString型で、変数testを宣言して、
クラスBで宣言した、CString型、test1に値を取得したいのですが、、
test1=A.testと書いても、初期値??を読んできて、おそらくNULLが入っている状態になっ
ています。
ちなみに、testには、そのクラス内の関数で、値は取得できるようにしてあります。
(値が入っているのも確認済みです。)
なにか、上手なソースの書き方があるのでしょうか??
ご教授ください。
環境はWin2000、MFCです。
クラスとインスタンスの関係がわかっていないご様子。
クラスを作っただけでは実体は何処にも無いです。
class A
{
public:
CString test;
};
class B
{
public:
CString test;
};
void foo(){
A a; // ←こうやって実体を作ってあげる
B b;
b.test = a.test; // A,B はクラス、a,bはインスタンス(実体)
}
あなたの状況を示すことが出来る最小限ので良いのでソースを示して下さい
そうでないとこちらで勝手に状況を設定してお話しなければならずお互いに
上手く伝え合う事が出来ないと思いますよ
ああ、これじゃやっぱり不定だけど、
クラスAといったとき、それは型であって実体ではないということを理解して欲しいのです。
アドバイスありがとうございます。
すいません。
言葉足らずでした。
以下にソースの一部を乗せます。
//IPコントロールに入っている値をとります
CEdit* myED3=(CEdit*)GetDlgItem(IDC_ADDRESS_ADD);
myED3->GetWindowText(ads);
↑この操作はクラスAでの操作
上の操作が終了した後に
A pro;
address=pro.ads;
pDC->TextOut(100,100,address);
といった感じでウインドウにアドレスを表示させようとしています。しかし、アドレスに引っ張
ってこられるのは、期待した値ではありません。。。
だから、
>A pro; // ココ
>address=pro.ads;
>pDC->TextOut(100,100,address);
この部分で、Aの『新しい』インスタンスが『生成』される。
ということを理解して欲しいのですが。
ありがとうございます。
すいません。
エラーの原因はわかりました。
で、
CEdit* myED3=(CEdit*)GetDlgItem(IDC_ADDRESS_ADD);
myED3->GetWindowText(ads);
↑ここで使われているインスタンスがわからないんですけど、
(adsがどこにはいるかがわからない)
クラス間で、共通に使えるインスタンスは、どう生成すればよいのでしょうか??
>//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のインスタンス(実体)は何処にあって、それと先ほどの
あなたのソースの「上の操作が終了した後に」との部分とのつながりはどうなって
いるのでしょうか、余りにも断片的なソースの示し方で訳(わけ)がわからない
私はあなたの状況が判る最小限とは書きましたが、お分かりですか?
親が管理するか、スタティックにするか、シングルトンにするか。
いろいろ、ケースバイケース。
すいません。
返事遅くなりました。。。
いろいろ、アドバイスありがとうございます。。。
説明不足で申し訳ありませんでした。
私の実装したい機能は、
メインウインドウからダイアログボックスを呼び出して、
そこにある絵をダブルクリックすると、
新しいダイアログボックス(プロパティシートのようなもの)を表示させ、
そこにある、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();
}
コンパイルは通るのですが、、、
どうか、ご教授ください。
現在アクティブなビューを取ってくるなら、(ダウンキャストがなんとなく嫌だけど)
AfxGetMainWnd() で、メインフレーム取ってきて、CFrameWnd*にキャストして
GetActiveView()でOK、
(だったとおもう。)
さらに目的のクラスへダウンキャストしてあげて、メンバを呼んであげればよろしいかと。
ダウンキャストが嫌いならメッセージを投げてあげるとかでなんとか。
で、どうでもいいことですが、一応重箱の隅をつつくと
MFCのドキュメントビューアーキテクチャではViewはメインウィンドウではないです。
> CClientDC mydc(this);
この場合の this は CPROPATY のことですよ。
PAIさんの方法で取ってきたViewクラスのポインタを入れてみてはどうで
しょうか?
ただこうやって表示してもViewが再描画されると消えるため、本来の処理
として一例を挙げると
1.Viewクラスに値を保存するメンバ変数を用意する。
2.OnDraw()にそれを表示する処理を書く
3.どこかで変数の値をセットする(この場合ダイアログになるでしょうか)
4.ViewクラスのInvalidate()を呼び出す。
とするべきかと思います。