連続の質問で申し訳ございません、お世話になります。
VC6なのですが、MFCの学習に、良ささそうなHPがありましたが、疑問に思うことがあり、
ここで質問させて頂きたく思います。
「始めましてVisualC++超入門」
http://www006.upp.so-net.ne.jp/candynar/visualc/visualc.htm
理由は、先ほど管理人さんへ、メールをしたのですが、HPに掲載されている
メールアドレスは既に存在して居ませんでした、恐縮ですがここで質問させて、いただき
たいと思います。
「L2Chapter3:データクラスを作ろう」
http://www006.upp.so-net.ne.jp/candynar/visualc/lesson2/l2chapter3.htm
コード4:OnDraw実装
void CClockView::OnDraw(CDC* pDC)
{
CClockDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
CClockData data=pDoc->m_curClock;
pDC->SetBkColor(data.GetBackColor());
pDC->SetTextColor(data.GetClockColor());
pDC->TextOut(0,0,テストテスト);
}
CClockData data=pDoc->m_curClock;
CClockData dataここの部分なのですが
CClockViewクラスと、CClockDataクラスの間に継承関係は無いのに、このような
実装は可能なのでしょうか、不思議に思い質問させて頂きました。
エキスパートの方、解説して頂けないでしょうか、宜しくお願いいたします。
補足
クラス間の関係ですが、基本的に、デフォルトMFC SDIで作成される、関係で構築してあ
るようで、
ドキュメントクラス(CClockDoc)
データクラス(CClockData)
ビュークラス(CClockView)
特にこの3つのクラスに、着目して書かれております。
※ ドキュメントクラスとビュークラスは、デフォルトMFC SDIと同じで、依存関係は無い
※ データクラス(CClockData)は、ドキュメントクラスと同じ、ファイルに記述
※ ドキュメントクラス内で、CClockData型のメンバー変数、m_curClockを作成
※ データクラス(CClockData)の、コンストラクタを、、ドキュメントクラス内の、
「OnNewDocument」の中で呼んでいます
当方、VS2005 MFCで
error C2065: 'CFCdata' : 定義されていない識別子です。
error C2146: 構文エラー : ';' が、識別子 'data' の前に必要です。
error C2065: 'data' : 定義されていない識別子です。
となります。
>当方、VS2005 MFCで
>error C2065: 'CFCdata' : 定義されていない識別子です。
>error C2146: 構文エラー : ';' が、識別子 'data' の前に必要です。
>error C2065: 'data' : 定義されていない識別子です。
>となります。
CFCdata とは何者ですか?
少なくとも、あなたが示したコード中には CFCdata は見当たりませんので
未定義な識別子だとコンパイラーがいうのは尤(もっと)もなことなのでしょう
エラーが出た(ソースの当該行)場所を示していないのでこれ以上のことは分かりませ
ん
>CClockData data=pDoc->m_curClock;
>CClockData dataここの部分なのですが
>
>CClockViewクラスと、CClockDataクラスの間に継承関係は無いのに、このような
>実装は可能なのでしょうか、不思議に思い質問させて頂きました。
##エキスパートではないので答える資格がないかもしれませんが...
pDoc の型は CClockDoc * で、
CClockDoc の public なメンバーに CClockData m_curClock があるのだから
pDoc ->m_curClock を CClockData 型の変数 data に代入することに
何か不思議なことがあるとは思えませんし、
CClockView と CClockData との継承関係の有無が関るとも思えません
もしかして 「have a」の関係と「is a」の関係をごっちゃにしてませんか?
継承は、is aの関係にあるクラス間で行なわれます。
have aの関係は継承とは別の話になりますよ。
あと、HPを参考にして勉強するのも良いのですが、
C++言語の入門書とか書籍も用意した方が良いです。
VC++6.0でMFCを使ったプログラミングを勉強する前に
C++言語の文法の勉強をした方が勉強の効率は良いと思うので
もし、いきなりVC++の勉強をしようとしているのであれば、
それは一旦置いて、C++言語の文法を先に勉強した方が良いと思いますよ。
すでにC++言語の文法は勉強済みで問題無いのであれば、
そのまま勉強を進めても良いと思うのですけれど。
> void CClockView::OnDraw(CDC* pDC)
> {
> ...
> CClockData data=pDoc->m_curClock;
> ...
> }
> CClockData data=pDoc->m_curClock;
> CClockData dataここの部分なのですが
> CClockViewクラスと、CClockDataクラスの間に継承関係は無いのに、このような
> 実装は可能なのでしょうか、不思議に思い質問させて頂きました。
これがダメとなると
void CClockView::XXX(const char* s) {
int n = strlen(s);
...
}
これもダメですね。
CClockViewとintの間には継承関係ありませんからね。
てことは、ほとんどのプログラムは実装不可能となりますね。
しまさん、PAITOさん、そしてεπιστημηさん
大いなる勘違いをしていました、大慌てして申し訳ございませんでした
また勘違いを、しているかも知れませんが、後。一点だけ、質問させてくださいませ
MFC SDIに於いて、ドキュメントクラスと、データクラスを、別にしようと考え、
今回の質問に至った訳なのですが、MFCドキュメントビューアーキテクチャーの
セオリーとして
① ドキュメントクラスのメンバー変数が更新されること
② UpdateAllViews(NULL)が実行されこと
この条件が揃わないと、Viewが更新されないと、理解しています
ここで、もし、ドキュメントクラスと、have aの関係にある、他のクラスの
メンバー変数が更新されても、やはり、ビュークラスの更新は行われないのでしょうか?
この考えが、正しいとすれば、ビュークラス(画面)を、更新するには、
Documentクラスに、データを置かなければ、ならないと言うことに、なると思うのですが
このように、したくない場合(ドキュメントクラスと、データクラスを別にして、データ
クラスのメンバー変数が更新された時に、ビュークラスを更新したい場合)
良い手法をご教示願えないでしょうか。
または、MFCドキュメントビューアーキテクチャーに拘らず、力技っぽいですが
SendMesage()で、ビュークラスにデータクラスのデータを送出して、表示させるとか、
のほうが、すっきりするのでしょうか?(この方法なら、実装できると思うのですが、な
るべくなら、オブジェクト指向的なアドバイスを頂きたい、所存です)
以上、長くなりましたが、よろしくお願いいたします。
ドキュメントクラスのメンバー変数が変更されてなくても
CDocument::UpdateAllViewsを呼んでもいいけどね。
Document has a データクラスでもいいよ。
class CMyDocument : public CDocument { CDataClass m_data; };
このm_dataもCMyDocumentからみればメンバー変数じゃん。
メンバー変数が変更されたことなんて
それがドキュメントクラスのメンバ変数であろうと
データクラスのメンバ変数であろうと
自動的にはわからないよ。
CDocument::UpdateAllViewsを呼んであげないと。
> SendMesage()で、ビュークラスにデータクラスのデータを送出して
これは、MFCが用意してくれた機能を使うか、自分で作った関数を使うかの違いでしょ。
別にいいんじゃない。
CDocument::UpdateAllViewsだとできなくて
SendMesageだとできると思う理由がわからないけど。
SendMesageだとデータクラスにCView*でも持たせるの?
だったらデータクラスにCDocument*を持たせてUpdateAllViewsを呼んでもいいじゃん。
余談
ドキュメントに対して複数のビューを使うことができる。
UpdateAllViewsには複数のビューへ通知する仕組みがある。
wclrp ( 'o') さん、お世話になります
ドキュメントクラスと、ビュークラスの関係が良く分りました
ドキュメントクラスの中で実装していた、データ部分を
データクラスを作成し分離し、CDocument::UpdateAllViewも正しく、実行できる
ことを、確認しました。そして、この分離作業を行ったことで、各クラスが、非常にすっ
きりしました。
お蔭様で、ソースコードの可読性も、良くなり。且つ、データクラスが
独立したことで、他のプログラムへの使いまわしも、可能となり、今の私のレベルから
すれば、非常に満足した結果が得られました、みなさんありがとうございました。