Upload
shaman
View
46
Download
0
Embed Size (px)
DESCRIPTION
3章 C++ プログラムの構成 2001年11月更新. オブジェクト指向プログラミングの概要 ー オブジェクト指向の考え方を理解する -. オブジェクト指向 ( Object Oriented Concept) とは?. ― ソフトウェアの構成を もの( Object) を中心に考えるアプローチ方法 ―. 《 オブジェクト(もの) 》. 情報を記録する 変数. 他のオブジェクト. 変数を操作する固有 の メソッド. 機能. 他のオブジェクトと 交信する メソッド. メッセージ のやりとり. Smalltalk,C++,Java など. - PowerPoint PPT Presentation
Citation preview
オブジェクト指向プログラミングの概要 ー オブジェクト指向の考え方を理解する -
3 章 C++ プログラムの構成 2001年 11 月更新
情報を記録する変数
情報を記録する変数
変数を操作する固有のメソッド
変数を操作する固有のメソッド他のオブジェクトと交信するメソッド
他のオブジェクトと交信するメソッド
《 オブジェクト(もの) 》
他のオブジェクト
メッセージのやりとり
Smalltalk,C++,Javaなど
オブジェクト指向 (Object Oriented Concept)とは?― ソフトウェアの構成を
もの( Object) を中心に考えるアプローチ方法 ―
機能
クラス 学 クラス 学生生― 変数名 ―学籍番号氏名年齢― メソッド名 ―学ぶ本を読む食べる会話をする
オブジェクト指向のいくつかの特徴(1) クラス&インスタン
ス
インスタンス 学生 1
インスタンス 学生 2
インスタンス 学生4
インスタンス 学生n
― 変数 ―学籍番号 = データ値 1
氏名 = データ値 2
年齢 = データ値 3
― メソッド ―学ぶ本を読む食べる会話をする
― 変数 ―学籍番号 = データ値 1
氏名 = データ値 2
年齢 = データ値 3
― メソッド ―学ぶ本を読む食べる会話をする
② 逆にインスタンスは クラスから生成する ものと考える
① 共通するもの ( 変数名,メソッド名) はクラスにまとめ,それを利用する
共通するメソッド名
共通するメソッド名
共通するメソッド名 (メンバ関数名)
共通する変数名
データと機能 ( メソッドと呼ぶ)が一緒になったオブジェクト(=インスタンス)を中心に考える.
毎にインスタンス異なる部分
毎にインスタンス異なる部分
共通する変数名
共通する変数名
(2) イベントの発生とメッセージの送受信
― 変数群―
身長=データ値1
体重=データ値 2
体温=データ値 3
学籍番号 = データ値 4
氏名 = データ値5
年齢 = データ値6
― メソッド群 ―歩く
走る
食べる
― 変数群―
身長=データ値1
体重=データ値 2
体温=データ値 3
学籍番号 = データ値 4
氏名 = データ値5
年齢 = データ値6
― メソッド群 ―歩く
走る
食べる
オブジェクトn
オブジェクト a
イベント 1 の発生イベント 1 の発生
他のオブジェクト
メッセージ「走る」 他のオブジェクトへの
メッセージ
他のオブジェクトへメッセージを送信するイベント
他のオブジェクトへメッセージを送信するイベント
一致するメソッドがあるば起動する
イベント(マウスクリックやメニュ―選択,タイマーのタイムアウト等)が生じるとメッセージが発生する.何をやるかは,メッセージを受信したオブジェクト側に記述する.
メッセージを受信したとき,やるべき操作を プログラムする
― 変数群 ―
身長=データ値1
体重=データ値 2
体温=データ値 3
学籍番号 = データ値 4
氏名 = データ値5
年齢 = データ値6
― メソッド群 ―歩く走る食べる会話をする学ぶ本を読む
― 変数群 ―
身長=データ値1
体重=データ値 2
体温=データ値 3
学籍番号 = データ値 4
氏名 = データ値5
年齢 = データ値6
― メソッド群 ―歩く走る食べる会話をする学ぶ本を読む
(3) 変数とメソッドの継承性
クラス 人間 クラス 人間― 変数名 ―身長体重体温― メソッド名 ―歩く走る食べる会話をする クラス 学生
― 属性名 ―学籍番号氏名年齢― メソッド名 ―学ぶ本を読む
継承する(上位クラスから変数名 やメソッド名を引き継ぐ)
学生の1つのインスタンス(オブジェクト)がもつ変数と利用可能なメソッド
「クラス 人間」から継承してきたメソッド
「クラス 人間」から継承してきた変数
「クラス 学生」のインスタンスを生成
クラス 会社 クラス 会社員員― 属性名 ―社員番号氏名― メソッド名 ―仕事をする打合せる
いろいろなクラスに共通する変数やメソッドは階層構造の上位クラスのもたせ,下位クラスはそこから自動的に変数名やメソッド名を引継ぐことができる.
(4) 多相性
クラス 人間 クラス 人間― 変数名 ―身長体重体温― メソッド名 ―歩く走る食べる会話をする
― 変数名 ―学籍番号氏名年齢― メソッド名 ―学ぶ本を読む会話をする // 英会話を意味する
継承
クラス 学生 クラス 学生 クラス 学生 クラス 学生
① 再定義できる.
a 人間
a 学生
生成
生成
aInstance
代入
代入
メッセージ「会話する」
メッセージ「会話する」
メッセージ「会話する」
② 同じメッセージで,受信側のオブジェクト毎に 操作内容を変えることができる.
メソッドは上位クラスと継承関係をもった下位クラスで再定義できる.
オブジェクト指向によるソフトウェア開発の利点
クラスやオブジェクト間の関連がソフトウェア開発の分析設計段階できると,後はそれぞれのオブジェクトのメソッドを詳細化して行くだけでよい。 (必要に応じて一時的な変数やメソッドを追加する)
:人 :人
:ペット :ペット
2: お座り
1: 指示を出す
3: お手
ペット愛称お手お座・・・
ペット愛称お手お座・・・
1
0..*
1
家0..2
人
氏名指示を出す
人
氏名指示を出す メソッドを次々
と追加
メソッド内容を段階的に詳細化
《 クラス図 》 《 オブジェクト図 》
補足補足
Visual Smalltalk Workbench 3.11 にみる
オブジェクト指向プログラミングの基本概念
部品クラスライブラリ
1 つのアプリケーション
Menuの1つのインスタンス
DialogBoxの1つのインスタンス
Windowの1つのインスタンス
イベント
② メッセージ
③Open メッセージを受信して,何をやるかは Window クラス側に記述されている
② イベントが起こったとき,オブジェクトに送るべきメッセージを指定する.
① インスタンスを 生成する
③Open メッセージを受信して,何をやるかは Window クラス側に記述されている
MenuItemの1つのインスタンス
プログラムはオブジェクト ( =インスタンス)とイベント,メッセージだけから構成され それらを図示しながらプログラムを作る.
MS Visual Studioを利用した
C++プログラミングの方法
MS Visual Studioを利用した
C++プログラミングの方法
オブジェクト p
rオブジェクトsオブジェクト
クラス B
クラス A
相互作用
クラス C第1段階:クラスの決定必要なクラスとクラス間の関連や継承関係等を決める
第2段階:メッセージの決定クラス間でやり取りされるメッセージを決める
スパイラル的に繰返し設計しプログラミングしてゆく
第3段階:具体的な手順の決定オブジェクトがメッセージを受取って何をやるかを決める
qオブジェクト
オブジェクト指向プログラミングはどのような手順で行うか
11
アプリケーションに共通 するデータを格納する機能 をもったクラス
(Modelクラス)
アプリケーションに共通 するデータを格納する機能 をもったクラス
(Modelクラス)
入出力表示の機能 をもったクラス
(Viewクラス)
入出力表示の機能 をもったクラス
(Viewクラス)
イベントの発生の監視や実行制御する機能をもったクラス ( Controllerクラス)
イベントの発生の監視や実行制御する機能をもったクラス ( Controllerクラス)
《 一般的なクラス構成の考え方: MVCモデル 》
第1段階:クラスの決定
必要なクラスとクラス間の関連や継承関係等を決める
互いに役割を分担した3つのクラス群が協調する形で ,1つのプログラムを構成する
Microsoft VC++では,Controllerクラスの機能はViewクラスに一緒になっている
Microsoft VC++では,Documentクラスと呼んでいる
◆ “MFC AppWi zard” を使うと,アプリケーションプログラムを構成する 基本的な 4 つのクラスを自動的に生成してくれる (メーンフレーム画面を作る代表的なアプリケーションのとき)
クラス クラス CC 名アプリケーション名アプリケーションDocDoc
クラス クラス CC 名アプリケーション名アプリケーションAppApp
クラス クラス CC 名アプリケーション名アプリケーションViewView
クラス クラス CMainFrmCMainFrm
アプリケーション全体の制御を担当するクラス . 最初に起動する.
アプリケーションで共通して用いるデータを格納しておく Model クラスに相当する
メインフレームウインドウ ( メニューバーを含む )の制御を担当するクラス
メインフレームウインドウ内のクライアント領域を管理するクラス
クラスクラス CWi CWinAppnApp
継承
クラス Cクラス CDocumentDocument
継承
クラス クラス CFameWndCFameWnd
クラス クラス CViewCView
継承
継承
必要に応じて関連をもつ
◆ 4つのクラスから生成されたインスタンスは,Windowシステムが監視し ているイベントが発生すると送られてくるメッセージを拾って,いろいろな 処理を行う.
class C ア フ ゚ リ ケ ー シ ョ ンView
class C ア フ ゚ リ ケ ー シ ョ ンView
アプリケーション App クラスの “インスタンス theApp”
C アプリケーション Viewの インスタンス
インスタンスを生成する
対応class CMainFrame
class CMainFrame
CMainFrameの インスタンス
インスタンスを生成する
class C アプリケーションApp
class C アプリケーションApp
インスタンスを生成する
インスタンスの生成メッセージ
最初に実行いろいろなイベント(マウスクリック,ボタンクリック,タイマー等)
イベントメッセージ
イベントメッセージの転送
対応
プログラムの世界
表示された世界
メニューバーメニューアイテム1メニューアイテム
2 領域クライアント
画面メインフレーム
class C ア フ ゚ リ ケ ー シ ョ ンView
class C ア フ ゚ リ ケ ー シ ョ ンView
class CMainFrame
class CMainFrame
class C アプリケーションApp
class C アプリケーションApp
◆ クラスはヘダーファイルとCPPファイルに分けて記述する(1)
アプリケーション名View.hアプリケーション名View.cpp
MainFrm.h
MainFrm.cpp
アプリケーション名 .h
アプリケーション名 .cpp
クラスの変数名やメンバ関数の プロトタイプ宣言クラスのメンバ関数の 具体的な内容を定義
クラスは,どこに,どのようにして書くのか
オブジェクト指向プログラミングはどのように行うか22
クラス名::メンバ関数名 // クラスがもつ固有の処理内容の定義{}
クラス名::メンバ関数名 // クラスがもつ固有の処理内容の定義{}
Class クラス名{ ・変数名(メンバ変数名と呼ぶ)群の定義
・メソッド名(メンバ関数名と呼ぶ)群のプロトタイプ宣言 ・イベントハンドラ関数名群のプロトタイプ宣言 (イベント発生のメッセージを拾って ,何らかの処理を行うメンバ関数)
DECLARE_MESSAGE_MAP() // イベントハンドラ関数があるとき記述する }
Class クラス名{ ・変数名(メンバ変数名と呼ぶ)群の定義
・メソッド名(メンバ関数名と呼ぶ)群のプロトタイプ宣言 ・イベントハンドラ関数名群のプロトタイプ宣言 (イベント発生のメッセージを拾って ,何らかの処理を行うメンバ関数)
DECLARE_MESSAGE_MAP() // イベントハンドラ関数があるとき記述する }
クラス名::イベントハンドラ関数名 // これもメンバ関数の一種である /* イベント メッセージを拾って行うべき処理の内容を定義する */
{}
クラス名::イベントハンドラ関数名 // これもメンバ関数の一種である /* イベント メッセージを拾って行うべき処理の内容を定義する */
{}
##include include “XXX.h“XXX.h””
◆ ヘダーファイルとCPPファイルに記述される内容(詳しい意味は後述)
BEGIN_MESSAGE_MAP
イベントメッセージを拾い起動するイベントハンドラ関数の対応付けマクロEND_MESSAGE_MAP
BEGIN_MESSAGE_MAP
イベントメッセージを拾い起動するイベントハンドラ関数の対応付けマクロEND_MESSAGE_MAP
ヘダーファイルヘダーファイル(( XXX .. hh ))
プロトタイプ宣言部
CPPCPP ファイルファイル(( XXXXXX .. cppcpp ))
各種メンバ関数の具体的な定義部
メンバ関数 ( =メソッド)とはクラスに含まれる(=クラスのメンバ)であることを意味する.
取り込む
class CCMDlg : public CDialog{ public:
CCMDlg(CWnd* pParent = NULL); // 標準のコンストラクタenum { IDD = IDD_CM_DIALOG };CString m_input;CString m_output;
protected:virtual void DoDataExchange(CDataExchange* pDX);
HICON m_hIcon;// 生成されたメッセージ マップ関数//{{AFX_MSG(CCMDlg)virtual BOOL OnInitDialog();afx_msg void OnSysCommand(UINT nID, LPARAM lParam);afx_msg void OnPaint();afx_msg HCURSOR OnQueryDragIcon();afx_msg void OnButtonA();afx_msg void OnButtonABar();afx_msg void OnButtonB();afx_msg void OnButtonBBar();//}}AFX_MSGDECLARE_MESSAGE_MAP()
};
新しいクラスはどのように記述するか
上位クラス名
継承性の制御(後で解説)
CDialog CDialog
C CMDlg C CMDlgOKボタンを押すと自動的にクラス CMDlgのプロト
タイプ宣言(ヘダーファイル)とハンドラ関数ファイル(cpp)が Visual Studioによって自動的に生成される
で例えリソースエディタば” IDD_DIALOG2”のリソース IDをもつ を作成し,ダイアログメニュー“挿入”から“ の新規作成”クラスを選ぶとこのような が表示さダイアログれる
上位クラスの意味
【補足】 クラスからインスタンスを作成したとき , メンバ変数を初期化したいとき
メンバ変数を初期化する特殊なメンバ関数=コンストラクタ
CSpeedDlg::CSpeedDlg(CWnd* pParent /*=NULL*/) : CDialog(CSpeedDlg::IDD, pParent)
{
m_resist = 0.0f;
m_speedX = 0.0f;
m_speedY = 0.0f;
m_speedZ = 0.0f;
}
クラス名とメンバ関数名が同じ
クラス CSPeedDlg のインスタンスを作成するとき,
CSPeedDlg で定義されたメンバ変数の値を初期化する.
初期化するとき , 初期値をパラメータで指定してもらうときもある
CDialog CDialog
CSpeedDlg CSpeedDlg
CSpeedDlgは CDialogクラスからもメンバ変数を継承する.
そこで CDialog のメンバ変数の初期化は,CD ialogの初期化 CDialogのコンストラクタを呼び出して任せる
第2段階:メッセージの決定
イベントメッセージを拾って起動すべきハンドラ関数名やクラス間
(あるいはクラス内)で呼出しあうメンバ関数名を決める.
クラス名::メンバ関数名 // クラス固有のがもついろいろな処理内容の定義{}
クラス名::メンバ関数名 // クラス固有のがもついろいろな処理内容の定義{}
クラス名::イベントハンドラ関数名 1 // これもメンバ関数の一種である /* 送られてきた イベントメッセージを拾って,そのイベントに対応する 処理内容を定義する */{ 他のメンバ関数の呼び出し; クラス名::メンバ関数名; // 他のクラスのメンバ関数の呼び出し}
クラス名::イベントハンドラ関数名 1 // これもメンバ関数の一種である /* 送られてきた イベントメッセージを拾って,そのイベントに対応する 処理内容を定義する */{ 他のメンバ関数の呼び出し; クラス名::メンバ関数名; // 他のクラスのメンバ関数の呼び出し}
##include include “XXX.h“XXX.h””BEGIN_MESSAGE_MAP
イベントメッセージを拾い起動するイベントハンドラ関数の対応付けマクロEND_MESSAGE_MAP
BEGIN_MESSAGE_MAP
イベントメッセージを拾い起動するイベントハンドラ関数の対応付けマクロEND_MESSAGE_MAP
各種メンバ関数の具体的な定義部イベントが発生したとき送られてくるイベントメッセージ
このクラスで拾うイベントメッセージがあれば,そのイベントメッセージに対応するイベントハンドラ関数を呼出す
必要に応じて呼出す
◆◆ GUIを構成する要素 ( オブジェクト)には,すべてリソース IDが付いており,実行時 にリソースで定義したリーソスにイベント(例えばクリック)が発生すると,リソース ID
をもったイベントメッセージがWindowsシステムから送られてくる
リソース IDは , リソースエディタでそれぞれのリソースオブジェクトに対して名付けた名前
ON_ COMMAND + IDC_SETTIMERON_ COMMAND + IDC_SETTIMER
イベントメッセージ名
リソースID
◆ インスタンスがイベントメッセージを受取ったとき, どのイベントハンドラ関数を呼び出すかはMESSAGE_MAPで対応つけている
(※MESSAGE_MAP は VC++ が自動的に作成する)
クラス名::メンバ関数名 // 関数の具体的な内容を定義{}
クラス名::メンバ関数名 // 関数の具体的な内容を定義{}クラス名:: OnKillTimer // イベントハンドラ関数の具体的な内容を定義{}
クラス名:: OnKillTimer // イベントハンドラ関数の具体的な内容を定義{}
##include “XXX.h”include “XXX.h”
BEGIN_MESSAGE_MAP
// メベントメッセージを拾って起動するイベントハンドラ関数の対応付け ON_COMMAND ( IDC_KILLTIMER, OnKillTimer )
END_MESSAGE_MAP
CPPCPP ファイルファイル(( XXXXXX .. cppcpp ))
クラス名:: On リソース ID_n // イベントハンドラ関数の具体的な内容を定義{}
クラス名:: On リソース ID_n // イベントハンドラ関数の具体的な内容を定義{}
イベントメッセーイベントメッセージ名の切り分けマクジ名の切り分けマクロ名ロ名
リソースリソースIDID
呼び出すイベントハン呼び出すイベントハンドラ関数名ドラ関数名
イベントメッセージON_COMMAND_IDC_KILLTIMER が来るとOnKillTime関数を呼出す
CTestAppの インスタンス theApp
CTestDialogのインスタンス
Windows Windows システムシステム
WM_ 名 コマンド + パラメータ
イベントメッセージ
構成上の にしたがって転送するリンク
を見るメッセージマップ
( に対応ダイログボックス )
CMainFrameのインスタンス( 画面に対応メイン )CMainFrameのインスタンス( 画面に対応メイン )
CTestViewの インスタンス( 領域に対応)クライアント
構成上のリンク
メニューバー
メニュー
メニューアイテム 1メニューアイテム 2
ボタン 1フィールド 1 ボタン 2
ダイアログボックス
メインフレーム画面
操作イベント
◆◆ イベントメッセージは,次々と転送される途中で各クラスのメッセージマップに 同じものがあれば拾われ,対応するイベントハンドラ関数を起動する
ON_COMMAND + オブジェクト ID
class CTestView
class CTestView
class CMainFrame
class CMainFrame
class CTest ン App
class CTest ン App
class CTestDialog
class CTestDialog
を見るメッセージマップ
を見るメッセージマップ
を見るメッセージマップ
に拾うべき 名メッセージマップ イメントメッセージがあれば, 関数を起動イベントハンドラ
に拾うべきメッセージマップ イメントメッセージ名があれば, 関数を起動イベントハンドラ
に拾うべきメッセージマップ イメントメッセージ名があれば, 関数を起動イベントハンドラ
に拾うべき 名メッセージマップ イメントメッセージがあれば, 関数を起動イベントハンドラマップを調べる順メッセージ
番
構成上のリンク
◆ ClassWizardを使うと,クラスで拾うべきイベントメッセージ(= の種類と が発生したイベント イベント リソース ID )と呼出すイベントハンドラ 関数名の指定が,半自動的できる.
拾うべき の種類イベント
イベントメッセージを拾ったとき実行するハンドラ関数名
どこのクラスで拾うかの指定
が発生したイベント リソース ID
イベントメッセージ名
クラス名::メンバ関数名 // 関数の具体的な内容を定義{}
クラス名::メンバ関数名 // 関数の具体的な内容を定義{}クラス名:: OnKillTimer // イベントハンドラ関数の具体的な内容を定義{}
クラス名:: OnKillTimer // イベントハンドラ関数の具体的な内容を定義{}
##include “XXX.h”include “XXX.h”
BEGIN_MESSAGE_MAP
/END_MESSAGE_MAP
CPPCPP ファイルファイル(( XXXXXX .. cppcpp ))
クラス名:: On リソース ID_n // イベントハンドラ関数の具体的な内容を定義{}
クラス名:: On リソース ID_n // イベントハンドラ関数の具体的な内容を定義{}
第3段階:第3段階:具体的な処理手順の決定具体的な処理手順の決定 インスタンスがイベントメッセージを受取ったり , 他から呼出さ れたとき 何をやるかの具体的な内容を決める
◆ メンバ関数内で新たにクラス (例えばDialog)のインスタンスを 作りたいとき,どのように記述するか.
CCMDlg dlg; /* <= クラス CCMDlg からインスタンス dlg を作成し, ダイアログのメモリ領域を確保する */
float x; // <= float型変数xのメモリ領域を確保する
d lg. DoModal(); // ダイアログを実際に表示するメンバ関数を呼び出す.
# include “CMDlg.h” // <= CMDlg の宣言部分をあらかじめ読み込み
上位クラスの意味
Dialog クラスを作成したときのクラス情報を格納したファイル名
◆ インスタンがもつ変数,メンバ関数へのアクセス方法
― 変数群 ―
float
m_resist;
float
m_speedX;
float
m_speedY;
float
m_speedZ;
― メンバ関数群 ―void addVelocuty();
void subtVelocity();
― 変数群 ―
float
m_resist;
float
m_speedX;
float
m_speedY;
float
m_speedZ;
― メンバ関数群 ―void addVelocuty();
void subtVelocity();
《 インスタンス g がもつ 変数とメンバ関数 》
g.m_speedX = 10.0 ; // 構造体のアクセスと同じ
g.addVelocity( ); // 構造体のアクセスと同じ
変数のアクセス方法
メンバ関数のアクセス方法
インスタンス名の後にドット(.)をつけて,変数名 ,メソッド名を記述する
--- プログラムの中で必要に応じて,動的にインスタンスを生成したいとき. ---
CMsgDlg * pDlg; /* <= 作成すべきクラス CMsg Dlg のインスタンスへの ポインタを格納しておくメモリ領域を確保する */ :
pDlg = new CMsgDlg(); /* <= クラス CMsg Dlg のインスタンスを作成し , そのインスタンスへのポインタを pDlg に格納する. */
pDlg-> DoModal() ; /* メンバ関数の呼び出し */
【上級編】
class CSpeedDlg : public CDialog
{
public:
CSpeedDlg(CWnd* pParent = NULL);
enum { IDD = IDD_DIALOG1 };
float m_speedX;
float m_speedY;
float m_speedZ;
float m_resist;
◆ ClassWizardを用いると,GUIを構成するオブジェクトのリソース IDと プログラム中のクラス内変数名とを簡単に対応されることができる
リソース ID: IDC_SPEEDXリソース ID: IDC_SPEEDYリソース ID: IDC_SPEEDZリソース ID: IDC_RESIST
GUI を構成するオブジェクトの世界
プログラムの世界
◆◆ ヘルパー ヘルパー (( お助け)関数お助け)関数
クラス名::メンバ関数名 // 関数の具体的な内容の定義{ 関数の呼び出し(...);
}
クラス名::メンバ関数名 // 関数の具体的な内容の定義{ 関数の呼び出し(...);
}
C言語関数の定義 ※(注) 識別子の有効範囲が異なるため この中ではクラスのメンバ変数やメンバ関数は 使用できない.
C ++のメンバ関数の中でも,Cの関数を補助的に使える
ヘルパー関数
VC++ でプログラミングするときの一般的な注意
◆ 呼出し可能なメンバ関数と継承性を利用して上位クラスのアクセス を制御する Private,Protected,Public
Private
Protected
Public
変数群メンバ
関数群メンバ
Private
Protected
Public
Class A Class A
Class B Class B上位のクラス
クラス内部でのみアクセスは可
外部からのアクセス
外部からのアクセス 変数群メンバ
関数群メンバ
変数群メンバ
関数群メンバ
外部からのクラス アクセス
変数群メンバ
関数群メンバ
変数群メンバ
関数群メンバ
変数群メンバ
関数群メンバ
継承によるアクセス
継承によるアクセス
継承によるアクセス
外部からのクラス アクセス
完全に外部から隠される
class C クラス名 App
class C クラス名 App
class CWinApp
class CWinApp
アプリケーション・オブジェクト インスタンス theApp
InitApplication関数①theAppのもつアプリケーションの初期化
Run関数③ theApp のもつイベントメッセージを取出す無限ループ
theAppに対して1: InitApplication 関数,2: InitInstance関数,3: Run関数の呼出し
WinMain(・・・・) WinMain(・・・・)
InitInstance関数② theAppのもつ 画面メインフレームや の作成と初期化ダイログボックス
InitInstance関数② theAppのもつ 画面メインフレームや の作成と初期化ダイログボックス
上位クラスのメンバ関数を継承
CCMAppからインスタンスを生成し,theAppとする.
// 唯一の C クラス名 App オブジェクト
C クラス名 App theApp;
【補足【補足 11 】 】 C++C++ プログラムの基本的な動作手順プログラムの基本的な動作手順
オブジェクト指向プログラミングの仕掛けを理解しよう
33
【補足【補足 22 】メインフレーム画面を用いるときの】メインフレーム画面を用いるときの InitInstanceInitInstance 関数の関数の処理処理
class CTestView
class CTestView
class CView
class CView
WinMain WinMain
1.TheAppの初期化処理を行うため CwinAppの InitApplication ( )関数を呼出す2.CWinTestの InitInstance関数を呼出す3. メッセージキューからイベントメッセージの取出しと無限ループを形成する CwinAppのRun ( )関数を呼出す
アプリケーションクラス(ここでは CWinTest)の インスタンス theApp
上位クラスのメンバ関数を継承
CTestViewのインスタンス
インスタンスを生成する
CWinTestの InitInstance 関数内から 生成関数インスタンス ( コンストラクタ ) を呼出す
画面メインフレーム
対応class CMainFrame
class CMainFrame
CMainFrameのインスタンス
インスタンスを生成する領域クライアント対応
【 補 足【 補 足 33 】 】 ダ イ ア ロ グ ボ ッ ク スダ イ ア ロ グ ボ ッ ク ス を 用 い る と きを 用 い る と きのの InitInstanceInitInstance 関数の処理関数の処理
class C 名ク ラ スDialog
class C 名ク ラ スDialog
class CDialog
class CDialog
WinMain WinMain
1.TheAppの初期化処理を行うため CwinAppの InitApplication ( )関数を呼出す2.CWinTestの InitInstance関数を呼出す3. メッセージキューからイベントメッセージの取出しと無限ループを形成する CwinAppのRun ( )関数を呼出す
アプリケーションクラス(ここでは CWinTest )の イ ン ス タ ン スtheApp
上位クラスのメンバ関数を継承
CWinTestの InitInstance 関数内から 生成インスタンス 関数 ( コンストラクタ ) を呼出す
C 名クラス Dialogのインスタンス
イ ン ス タ ン ス 生 成 呼 出 し を 受け, CCMDialog のインスタンスを生成する
ダイアログボックス
対応