最近お世話になっております,さみです。
今回もよろしくお願いします。
環境は Windows2003/VisualC++ 2005/MFC・MDI です。
クラス間でメンバ変数のデータを共有させたいのですが,
「CXX0030 式を評価できません」エラーが連発している状態です。
やりたいことなのですが,CAViewの(int)max_dataをCBViewのメンバ変数(int)maxに代入
してデータを持たせたいと考えています。
(簡単に)プログラムを示しますと,
【AView.cpp】
CBView* pBview = new CBView;
pBView->max = max_data;
【AView.h】
#include BView.h
:
:
public:
CBView* p_BView;
このような感じです。
そもそもpBiewのハンドルが「???」の状態になってしまっていますので,ハンドルを取得
できていないのだと思います。
色々調べたのですが,上記の方法でできるようだったのですが・・・できません。
不足している情報などがありましたらまた提示しますので,なんなりとご指摘ください。
どうかよろしくお願いします。
デバッガで変数の値が見えないって意味か。
デバッグ用にコンパイルしてあるやつをデバッガで実行しているんだよね?
最適化してあってECXレジスタがthisを指してないとメンバ変数はデバッガで見れないぞ。
バッファオーバーランとかで値をおかしくしているとか。
エディットコンティニューが効いているならリビルドしてごらん。
デバッガで変数の値が見えないからといって共有できてないわけじゃないし。
てか、
CBView* pBview = new CBView;
の実行後いきなりpBiewがアクセスできない
メモリ(アドレス)を指しているポインタなのか?
> そもそもpBiewのハンドルが「???」の状態になってしまっていますので,ハンドルを取得
> できていないのだと思います。
p_BViewはNULLじゃないけど、
p_BView->m_hWndが0(または不定)という意味ですか?
CBViewがCViewを継承しているとすると、コンストラクタでは、
ウィンドウと結びついていないということではないですか?
クラスのインスタンスがあっても、(OSに管理される)対応するウィンドウがなければ、
有効なハンドルがあるはずがない。
不足している情報は、とりあえず、、、
CBViewの継承元は?
CBViewのコンストラクタは何をしている?
このとき、扱いたいCBViewの実態はあるはず?
wclrp ( 'o')さん,素早いお返事,感謝します!!
VC++初心者なので,wclrp ( 'o')さんの書かれてることも意味を調べつつ解釈しました。
そのレベルの初心者だとご認識いただけたら幸いです。
さて,
>デバッグ用にコンパイルしてあるやつをデバッガで実行しているんだよね?
は,その通りだと思います。
リビルドもしてみたのですが,やはり同じ場所でひっかかりました。
またバッファオーバーランですが,これが起こるとは思えないんですが・・・
なんせmax_dataが一桁の整数なので・・・(という考え方があってるかわからないのです
が)。
>CBView* pBview = new CBView;
>の実行後いきなりpBiewがアクセスできない
>メモリ(アドレス)を指しているポインタなのか?
ここの部分の意味がちょっとわからないのですが,目的は「BViewのmax」としたいと思っ
ています。
これでは不適切なのでしょうか?
ご指導お願いします。
たいちうさん,お返事ありがとうございます!
またまた調べつつの解答になってしまったので,返事が遅くなってしまいました。
>p_BView->m_hWndが0(または不定)という意味ですか?
ですが,実行中(?)にCBView*にマウス乗せると {CBView ???} となり,
pBViewにマウスを乗せると 0xcccccccc{CBView ???}となるため,「ハンドルが取得でき
てないのかな?」と考えた次第です。
>CBViewの継承元は?
CFormViewです。(この答えで合ってるのかも不安。。)
ヘッダーファイルの
class CBView : public CFormView
から,こう答えました。
>CBViewのコンストラクタは何をしている?
ですが,コンストラクタを設定してないみたいです。
コンストラクタも何かわからなかったので調べて,自分のプログラムを照らしてみたので
すが,そのような宣言をしている部分がありませんでした。
設定した方がいいのでしょうか?
>このとき、扱いたいCBViewの実態はあるはず?
よって,実態もどうなっているのかわからない状態です。
わからないことだらけで申し訳ありませんが,とても勉強になるので,お付き合いいただ
けたら嬉しいです。
よろしくお願いします。
一度プロジェクトを閉じて、
Releaseやdebugフォルダ(検索で探して2つあったらどっちも)を消す
ncbファイルも消す。
ソリューションのクリーンやソリューションのリビルドして
余計な中間ファイルを一度消す。
これらをやってから、立ち上げなおしてみてください
rinさん,アドバイスありがとうございます。
指定されたものを全て消して,リビルド等もして立ち上げてみました。
・・・ダメでした。同じエラーが出てしまいました。
「エラーで詰まったらncdファイルを消す」って手は良く使われるみたいですね。
覚えておきます!
> ソリューションのクリーンやソリューションのリビルドして
> 余計な中間ファイルを一度消す。
この症状でファイル削除、リビルドしたところで何の解決にならんと思うが...
> pBViewにマウスを乗せると 0xcccccccc{CBView ???}となるため,
VC++でデバッグビルドした場合、変数は0xCCで初期化されます。
つまり、この現象はpBViewに対して代入が行なわれていないということ。
pBViewが0xccccccccだったのは代入前に値を確認したからではないかと推測します。
CBView* pBview = new CBView;
の行にブレークポイントをしかけて、ステップ実行してみてください。
ステップ実行後にpBviewの値が0xccccccccだったら手に負えない。
> コンストラクタも何かわからなかったので調べて,自分のプログラムを照らしてみたので
> すが,そのような宣言をしている部分がありませんでした。
BView.cppに
CBView::CBView()
{}
または
BView.hに
class CBView : public CFormView
{
public:
CBView() : CFormView() {};
}
がありませんか?
無ければコンストラクタを追加して、コンストラクタにブレークポイントをかけて、
CBView* pBview = new CBView;
のコードから呼び出されているかを確認。
# なんかデバックの基礎講座みたい。
ところで、
> 【AView.cpp】
> CBView* pBview = new CBView;
のpBViewと
> 【AView.h】
> CBView* p_BView;
のp_BViewの関係は?
データ形がCBView*で同じだからといってpBViewとp_BViewは全く別物なんだけど。
何か勘違いしていませんか?
もう一度よく読んでみると
> MFC・MDI
で
> CBView* pBview = new CBView;
と
> >CBViewの継承元は?
> CFormViewです。(この答えで合ってるのかも不安。。)
> ヘッダーファイルの
> class CBView : public CFormView
> から,こう答えました。
は、なんか変。
MFC・MDIでCFormViewを使うってことは、表示画面がCFormViewだと思うけど、
MFCのMDIアプリではViewをユーザがnewすることは一般的には無いはず。
# 普通はフレームワークが生成する。
ビューの管理をフレームワークに任せず、自分でやっているなら別だけど、
そこまではやっていないでしょ。
maruさん,コメントありがとうございます!
ステップ実行してみました。
maruさんのおっしゃる通り,代入前が0xccの状態でした。
そして,実行後には 0x00000000 {CBView ???} となって,そのあとアクセス違反が発生
するという事態です。
また,あとのコメントで書かれていることを考えてみたのですが,
ヘッダーの方にある宣言は間違いでpBViewのことを指したかったのです。
しかし考えてみるとその二つの命令は重複した内容のことをさせているんだと気づきました。
ですので.cppの方の命令をコメントアウトして実行させてみました。
そしたら先に述べたようになりました。
コンストラクタについてですが,.cppにはそのような記述がありました!
しかし.hには見つかりませんでした。見つからないと言っても
> CBView() : CFormView() {};
の記述がないということなのですが,これは自然についているものなのでしょうか?
似たようなもので
protected:
CBView(); // 動的生成で使用される protected コンストラクタ
virtual ~CBView();
なのはありました。
ご指導よろしくお願いします!!
maruさん,本当にありがとうございます!
>ビューの管理をフレームワークに任せず・・・
は任せていると思います。
やはり
>>> CBView* pBview = new CBView;
が自分の間違いじゃないかと思っています。。
釈迦に説法かもとも思いますけれど。
C++言語の文法自体が怪しいのではないかなぁと言う気がします。
MFCのクラスが云々と言う話ではない気がする。
C++言語の入門書にあるような単純化されたクラスで
C++言語の文法とクラスとは?みたいな部分を勉強した方が
実際には早道なのではないかなぁ。
PATIOさん・・・重々承知しています。。
全然回質問したときもそのように助言をうけたのですが,何分時間がなくて。
(あと一週間ないのです。。)
とは言っても必要な知識なので,手元にあるビギナー編の参考書のクラスの項をしっかり
読み返したいと思います!
MSDN CDのサンプルソースを見ましょう。
INETで探す必要はないです。
MSDN CDサンプル、特にMFC関連は種類が豊富です。
手始めに、チュートリアルのシリーズがお勧めです。