このような、継承ってできるのですか?

[戻る]
湿布薬 2008/10/14(火) 00:52:23
連続の質問で申し訳ございません、お世話になります。
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' : 定義されていない識別子です。
となります。

しま 2008/10/14(火) 05:56:37
>当方、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 との継承関係の有無が関るとも思えません

PATIO 2008/10/14(火) 10:50:22
もしかして 「have a」の関係と「is a」の関係をごっちゃにしてませんか?
継承は、is aの関係にあるクラス間で行なわれます。
have aの関係は継承とは別の話になりますよ。

PATIO 2008/10/14(火) 10:55:16
あと、HPを参考にして勉強するのも良いのですが、
C++言語の入門書とか書籍も用意した方が良いです。
VC++6.0でMFCを使ったプログラミングを勉強する前に
C++言語の文法の勉強をした方が勉強の効率は良いと思うので
もし、いきなりVC++の勉強をしようとしているのであれば、
それは一旦置いて、C++言語の文法を先に勉強した方が良いと思いますよ。
すでにC++言語の文法は勉強済みで問題無いのであれば、
そのまま勉強を進めても良いと思うのですけれど。

επιστημη [HomePage] 2008/10/14(火) 11:58:18
> 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の間には継承関係ありませんからね。
てことは、ほとんどのプログラムは実装不可能となりますね。

湿布薬 2008/10/17(金) 22:10:02
しまさん、PAITOさん、そしてεπιστημηさん
大いなる勘違いをしていました、大慌てして申し訳ございませんでした
また勘違いを、しているかも知れませんが、後。一点だけ、質問させてくださいませ
MFC SDIに於いて、ドキュメントクラスと、データクラスを、別にしようと考え、
今回の質問に至った訳なのですが、MFCドキュメントビューアーキテクチャーの
セオリーとして
@ ドキュメントクラスのメンバー変数が更新されること
A UpdateAllViews(NULL)が実行されこと
この条件が揃わないと、Viewが更新されないと、理解しています
ここで、もし、ドキュメントクラスと、have aの関係にある、他のクラスの
メンバー変数が更新されても、やはり、ビュークラスの更新は行われないのでしょうか?
この考えが、正しいとすれば、ビュークラス(画面)を、更新するには、
Documentクラスに、データを置かなければ、ならないと言うことに、なると思うのですが
このように、したくない場合(ドキュメントクラスと、データクラスを別にして、データ
クラスのメンバー変数が更新された時に、ビュークラスを更新したい場合)
良い手法をご教示願えないでしょうか。
または、MFCドキュメントビューアーキテクチャーに拘らず、力技っぽいですが
SendMesage()で、ビュークラスにデータクラスのデータを送出して、表示させるとか、
のほうが、すっきりするのでしょうか?(この方法なら、実装できると思うのですが、な
るべくなら、オブジェクト指向的なアドバイスを頂きたい、所存です)
以上、長くなりましたが、よろしくお願いいたします。

wclrp ( 'o') 2008/10/17(金) 23:43:01
ドキュメントクラスのメンバー変数が変更されてなくても
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には複数のビューへ通知する仕組みがある。

湿布薬 2008/10/18(土) 07:39:56
[[解決]]
wclrp ( 'o') さん、お世話になります
ドキュメントクラスと、ビュークラスの関係が良く分りました
ドキュメントクラスの中で実装していた、データ部分を
データクラスを作成し分離し、CDocument::UpdateAllViewも正しく、実行できる
ことを、確認しました。そして、この分離作業を行ったことで、各クラスが、非常にすっ
きりしました。
お蔭様で、ソースコードの可読性も、良くなり。且つ、データクラスが
独立したことで、他のプログラムへの使いまわしも、可能となり、今の私のレベルから
すれば、非常に満足した結果が得られました、みなさんありがとうございました。

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