32
オオオオオオオオオオオオオオオオオオ オ オオオオオオオオオオオオオオオオオ 3 オ C++ オオオオオオオオ 2001 オ 11 オオオ

オブジェクト指向プログラミングの概要     ー オブジェクト指向の考え方を理解する -

  • 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

Page 1: オブジェクト指向プログラミングの概要     ー オブジェクト指向の考え方を理解する -

オブジェクト指向プログラミングの概要    ー オブジェクト指向の考え方を理解する -

3 章  C++ プログラムの構成   2001年 11 月更新

Page 2: オブジェクト指向プログラミングの概要     ー オブジェクト指向の考え方を理解する -

 情報を記録する変数   

 情報を記録する変数   

変数を操作する固有のメソッド

変数を操作する固有のメソッド他のオブジェクトと交信するメソッド

他のオブジェクトと交信するメソッド

《 オブジェクト(もの) 》

他のオブジェクト

メッセージのやりとり

Smalltalk,C++,Javaなど

オブジェクト指向 (Object Oriented Concept)とは?―  ソフトウェアの構成を

     もの( Object) を中心に考えるアプローチ方法 ―

機能

Page 3: オブジェクト指向プログラミングの概要     ー オブジェクト指向の考え方を理解する -

 クラス 学 クラス 学生生―  変数名 ―学籍番号氏名年齢―  メソッド名 ―学ぶ本を読む食べる会話をする

オブジェクト指向のいくつかの特徴(1) クラス&インスタン

インスタンス 学生 1

インスタンス 学生 2

インスタンス 学生4

インスタンス 学生n

―  変数 ―学籍番号 =  データ値 1

氏名    =  データ値 2

年齢    =  データ値 3

―  メソッド ―学ぶ本を読む食べる会話をする

―  変数 ―学籍番号 =  データ値 1

氏名    =  データ値 2

年齢    =  データ値 3

―  メソッド ―学ぶ本を読む食べる会話をする

②  逆にインスタンスは  クラスから生成する    ものと考える

① 共通するもの ( 変数名,メソッド名) はクラスにまとめ,それを利用する

共通するメソッド名

共通するメソッド名

共通するメソッド名  (メンバ関数名)

共通する変数名

データと機能 ( メソッドと呼ぶ)が一緒になったオブジェクト(=インスタンス)を中心に考える.

毎にインスタンス異なる部分

毎にインスタンス異なる部分

共通する変数名

共通する変数名

Page 4: オブジェクト指向プログラミングの概要     ー オブジェクト指向の考え方を理解する -

(2) イベントの発生とメッセージの送受信

―  変数群―

身長=データ値1

体重=データ値 2

体温=データ値 3

学籍番号 = データ値 4

氏名 =  データ値5

年齢 =  データ値6

―  メソッド群 ―歩く

走る

食べる

―  変数群―

身長=データ値1

体重=データ値 2

体温=データ値 3

学籍番号 = データ値 4

氏名 =  データ値5

年齢 =  データ値6

―  メソッド群 ―歩く

走る

食べる

  オブジェクトn

オブジェクト a

イベント 1 の発生イベント 1 の発生

他のオブジェクト

メッセージ「走る」 他のオブジェクトへの

       メッセージ

他のオブジェクトへメッセージを送信するイベント

他のオブジェクトへメッセージを送信するイベント

一致するメソッドがあるば起動する

イベント(マウスクリックやメニュ―選択,タイマーのタイムアウト等)が生じるとメッセージが発生する.何をやるかは,メッセージを受信したオブジェクト側に記述する.

メッセージを受信したとき,やるべき操作を                 プログラムする

Page 5: オブジェクト指向プログラミングの概要     ー オブジェクト指向の考え方を理解する -

―  変数群 ―

身長=データ値1

体重=データ値 2

体温=データ値 3

学籍番号 = データ値 4

氏名 =  データ値5

年齢 =  データ値6

―  メソッド群 ―歩く走る食べる会話をする学ぶ本を読む

―  変数群 ―

身長=データ値1

体重=データ値 2

体温=データ値 3

学籍番号 = データ値 4

氏名 =  データ値5

年齢 =  データ値6

―  メソッド群 ―歩く走る食べる会話をする学ぶ本を読む

 (3) 変数とメソッドの継承性

 クラス 人間 クラス 人間―  変数名 ―身長体重体温―  メソッド名 ―歩く走る食べる会話をする  クラス 学生

―  属性名 ―学籍番号氏名年齢―  メソッド名 ―学ぶ本を読む

 継承する(上位クラスから変数名 やメソッド名を引き継ぐ)

学生の1つのインスタンス(オブジェクト)がもつ変数と利用可能なメソッド

「クラス 人間」から継承してきたメソッド

「クラス 人間」から継承してきた変数

「クラス 学生」のインスタンスを生成

 クラス 会社 クラス 会社員員―  属性名 ―社員番号氏名―  メソッド名 ―仕事をする打合せる

いろいろなクラスに共通する変数やメソッドは階層構造の上位クラスのもたせ,下位クラスはそこから自動的に変数名やメソッド名を引継ぐことができる.

Page 6: オブジェクト指向プログラミングの概要     ー オブジェクト指向の考え方を理解する -

 (4) 多相性

 クラス 人間 クラス 人間―  変数名 ―身長体重体温―  メソッド名 ―歩く走る食べる会話をする

―  変数名 ―学籍番号氏名年齢―  メソッド名 ―学ぶ本を読む会話をする   // 英会話を意味する

継承

 クラス 学生 クラス 学生 クラス 学生 クラス 学生

①  再定義できる.

a 人間

a 学生

生成

生成

aInstance

代入

代入

メッセージ「会話する」

メッセージ「会話する」

メッセージ「会話する」

②  同じメッセージで,受信側のオブジェクト毎に  操作内容を変えることができる.

メソッドは上位クラスと継承関係をもった下位クラスで再定義できる.

Page 7: オブジェクト指向プログラミングの概要     ー オブジェクト指向の考え方を理解する -

オブジェクト指向によるソフトウェア開発の利点 

クラスやオブジェクト間の関連がソフトウェア開発の分析設計段階できると,後はそれぞれのオブジェクトのメソッドを詳細化して行くだけでよい。       (必要に応じて一時的な変数やメソッドを追加する)

:人 :人

:ペット :ペット

2: お座り

1: 指示を出す

3: お手

ペット愛称お手お座・・・

ペット愛称お手お座・・・

0..*

家0..2

人  

氏名指示を出す

人  

氏名指示を出す メソッドを次々

と追加

メソッド内容を段階的に詳細化

《 クラス図 》 《 オブジェクト図 》

補足補足

Page 8: オブジェクト指向プログラミングの概要     ー オブジェクト指向の考え方を理解する -

Visual Smalltalk Workbench   3.11 にみる

       オブジェクト指向プログラミングの基本概念

部品クラスライブラリ

1 つのアプリケーション

Menuの1つのインスタンス

DialogBoxの1つのインスタンス

Windowの1つのインスタンス

イベント

② メッセージ

③Open メッセージを受信して,何をやるかは Window クラス側に記述されている

② イベントが起こったとき,オブジェクトに送るべきメッセージを指定する.

① インスタンスを  生成する

③Open メッセージを受信して,何をやるかは Window クラス側に記述されている

MenuItemの1つのインスタンス

プログラムはオブジェクト ( =インスタンス)とイベント,メッセージだけから構成され                          それらを図示しながらプログラムを作る.

Page 9: オブジェクト指向プログラミングの概要     ー オブジェクト指向の考え方を理解する -

MS Visual Studioを利用した

     C++プログラミングの方法

MS Visual Studioを利用した

     C++プログラミングの方法

Page 10: オブジェクト指向プログラミングの概要     ー オブジェクト指向の考え方を理解する -

オブジェクト p

rオブジェクトsオブジェクト

クラス B

クラス A

相互作用

クラス C第1段階:クラスの決定必要なクラスとクラス間の関連や継承関係等を決める

第2段階:メッセージの決定クラス間でやり取りされるメッセージを決める

スパイラル的に繰返し設計しプログラミングしてゆく

第3段階:具体的な手順の決定オブジェクトがメッセージを受取って何をやるかを決める

qオブジェクト

オブジェクト指向プログラミングはどのような手順で行うか

11

Page 11: オブジェクト指向プログラミングの概要     ー オブジェクト指向の考え方を理解する -

 アプリケーションに共通 するデータを格納する機能   をもったクラス

   (Modelクラス)

 アプリケーションに共通 するデータを格納する機能   をもったクラス

   (Modelクラス)

 入出力表示の機能  をもったクラス

     (Viewクラス)

 入出力表示の機能  をもったクラス

     (Viewクラス)

 イベントの発生の監視や実行制御する機能をもったクラス ( Controllerクラス)

 イベントの発生の監視や実行制御する機能をもったクラス ( Controllerクラス)

《 一般的なクラス構成の考え方: MVCモデル 》

第1段階:クラスの決定

       必要なクラスとクラス間の関連や継承関係等を決める

互いに役割を分担した3つのクラス群が協調する形で ,1つのプログラムを構成する

Microsoft VC++では,Controllerクラスの機能はViewクラスに一緒になっている

Microsoft VC++では,Documentクラスと呼んでいる

Page 12: オブジェクト指向プログラミングの概要     ー オブジェクト指向の考え方を理解する -

◆ “MFC AppWi zard” を使うと,アプリケーションプログラムを構成する        基本的な 4 つのクラスを自動的に生成してくれる        (メーンフレーム画面を作る代表的なアプリケーションのとき)

 クラス  クラス  CC 名アプリケーション名アプリケーションDocDoc

 クラス  クラス  CC 名アプリケーション名アプリケーションAppApp

 クラス  クラス  CC 名アプリケーション名アプリケーションViewView

 クラス  クラス CMainFrmCMainFrm

アプリケーション全体の制御を担当するクラス . 最初に起動する.

アプリケーションで共通して用いるデータを格納しておく Model クラスに相当する

メインフレームウインドウ ( メニューバーを含む )の制御を担当するクラス

メインフレームウインドウ内のクライアント領域を管理するクラス

クラスクラス CWi CWinAppnApp

継承

クラス Cクラス CDocumentDocument

継承

クラス クラス CFameWndCFameWnd

クラス クラス CViewCView

継承

継承

必要に応じて関連をもつ

Page 13: オブジェクト指向プログラミングの概要     ー オブジェクト指向の考え方を理解する -

◆ 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 領域クライアント

画面メインフレーム

Page 14: オブジェクト指向プログラミングの概要     ー オブジェクト指向の考え方を理解する -

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

Page 15: オブジェクト指向プログラミングの概要     ー オブジェクト指向の考え方を理解する -

クラス名::メンバ関数名  // クラスがもつ固有の処理内容の定義{}

クラス名::メンバ関数名  // クラスがもつ固有の処理内容の定義{}

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 ))

各種メンバ関数の具体的な定義部

メンバ関数 ( =メソッド)とはクラスに含まれる(=クラスのメンバ)であることを意味する.

取り込む

Page 16: オブジェクト指向プログラミングの概要     ー オブジェクト指向の考え方を理解する -

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をもつ を作成し,ダイアログメニュー“挿入”から“ の新規作成”クラスを選ぶとこのような が表示さダイアログれる

上位クラスの意味

Page 17: オブジェクト指向プログラミングの概要     ー オブジェクト指向の考え方を理解する -

【補足】 クラスからインスタンスを作成したとき , メンバ変数を初期化したいとき

           メンバ変数を初期化する特殊なメンバ関数=コンストラクタ

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のコンストラクタを呼び出して任せる

Page 18: オブジェクト指向プログラミングの概要     ー オブジェクト指向の考え方を理解する -

第2段階:メッセージの決定

   イベントメッセージを拾って起動すべきハンドラ関数名やクラス間

        (あるいはクラス内)で呼出しあうメンバ関数名を決める.

クラス名::メンバ関数名  // クラス固有のがもついろいろな処理内容の定義{}

クラス名::メンバ関数名  // クラス固有のがもついろいろな処理内容の定義{}

クラス名::イベントハンドラ関数名 1    // これもメンバ関数の一種である  /* 送られてきた イベントメッセージを拾って,そのイベントに対応する                                  処理内容を定義する */{    他のメンバ関数の呼び出し;    クラス名::メンバ関数名;     // 他のクラスのメンバ関数の呼び出し}

クラス名::イベントハンドラ関数名 1    // これもメンバ関数の一種である  /* 送られてきた イベントメッセージを拾って,そのイベントに対応する                                  処理内容を定義する */{    他のメンバ関数の呼び出し;    クラス名::メンバ関数名;     // 他のクラスのメンバ関数の呼び出し}

##include include “XXX.h“XXX.h””BEGIN_MESSAGE_MAP

   イベントメッセージを拾い起動するイベントハンドラ関数の対応付けマクロEND_MESSAGE_MAP

BEGIN_MESSAGE_MAP

   イベントメッセージを拾い起動するイベントハンドラ関数の対応付けマクロEND_MESSAGE_MAP

各種メンバ関数の具体的な定義部イベントが発生したとき送られてくるイベントメッセージ

このクラスで拾うイベントメッセージがあれば,そのイベントメッセージに対応するイベントハンドラ関数を呼出す

必要に応じて呼出す

Page 19: オブジェクト指向プログラミングの概要     ー オブジェクト指向の考え方を理解する -

◆◆  GUIを構成する要素 ( オブジェクト)には,すべてリソース IDが付いており,実行時   にリソースで定義したリーソスにイベント(例えばクリック)が発生すると,リソース ID

   をもったイベントメッセージがWindowsシステムから送られてくる

リソース IDは , リソースエディタでそれぞれのリソースオブジェクトに対して名付けた名前

ON_ COMMAND + IDC_SETTIMERON_ COMMAND + IDC_SETTIMER

イベントメッセージ名

リソースID

Page 20: オブジェクト指向プログラミングの概要     ー オブジェクト指向の考え方を理解する -

◆ インスタンスがイベントメッセージを受取ったとき,   どのイベントハンドラ関数を呼び出すかは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関数を呼出す

Page 21: オブジェクト指向プログラミングの概要     ー オブジェクト指向の考え方を理解する -

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        

を見るメッセージマップ

を見るメッセージマップ

を見るメッセージマップ

に拾うべき 名メッセージマップ イメントメッセージがあれば, 関数を起動イベントハンドラ

に拾うべきメッセージマップ イメントメッセージ名があれば, 関数を起動イベントハンドラ

に拾うべきメッセージマップ イメントメッセージ名があれば, 関数を起動イベントハンドラ

に拾うべき 名メッセージマップ イメントメッセージがあれば, 関数を起動イベントハンドラマップを調べる順メッセージ

構成上のリンク

Page 22: オブジェクト指向プログラミングの概要     ー オブジェクト指向の考え方を理解する -

◆   ClassWizardを使うと,クラスで拾うべきイベントメッセージ(=      の種類と が発生したイベント イベント リソース ID )と呼出すイベントハンドラ     関数名の指定が,半自動的できる.

拾うべき の種類イベント

イベントメッセージを拾ったとき実行するハンドラ関数名

どこのクラスで拾うかの指定

が発生したイベント リソース ID

イベントメッセージ名

Page 23: オブジェクト指向プログラミングの概要     ー オブジェクト指向の考え方を理解する -

クラス名::メンバ関数名        // 関数の具体的な内容を定義{}

クラス名::メンバ関数名        // 関数の具体的な内容を定義{}クラス名:: 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段階:具体的な処理手順の決定具体的な処理手順の決定        インスタンスがイベントメッセージを受取ったり , 他から呼出さ  れたとき 何をやるかの具体的な内容を決める

Page 24: オブジェクト指向プログラミングの概要     ー オブジェクト指向の考え方を理解する -

◆ メンバ関数内で新たにクラス (例えばDialog)のインスタンスを                     作りたいとき,どのように記述するか.

CCMDlg dlg; /* <= クラス CCMDlg からインスタンス dlg を作成し,                  ダイアログのメモリ領域を確保する    */

float x; // <= float型変数xのメモリ領域を確保する

d lg. DoModal(); // ダイアログを実際に表示するメンバ関数を呼び出す.

# include “CMDlg.h” // <= CMDlg の宣言部分をあらかじめ読み込み

上位クラスの意味

Dialog クラスを作成したときのクラス情報を格納したファイル名

Page 25: オブジェクト指向プログラミングの概要     ー オブジェクト指向の考え方を理解する -

◆ インスタンがもつ変数,メンバ関数へのアクセス方法

―  変数群 ―

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( ); //  構造体のアクセスと同じ

変数のアクセス方法

メンバ関数のアクセス方法

インスタンス名の後にドット(.)をつけて,変数名 ,メソッド名を記述する

Page 26: オブジェクト指向プログラミングの概要     ー オブジェクト指向の考え方を理解する -

--- プログラムの中で必要に応じて,動的にインスタンスを生成したいとき. ---

CMsgDlg * pDlg; /* <=  作成すべきクラス CMsg Dlg のインスタンスへの                         ポインタを格納しておくメモリ領域を確保する */ :

pDlg = new CMsgDlg(); /* <= クラス CMsg Dlg のインスタンスを作成し , そのインスタンスへのポインタを pDlg に格納する. */

pDlg-> DoModal()          ; /*  メンバ関数の呼び出し   */

【上級編】

Page 27: オブジェクト指向プログラミングの概要     ー オブジェクト指向の考え方を理解する -

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 を構成するオブジェクトの世界

プログラムの世界

Page 28: オブジェクト指向プログラミングの概要     ー オブジェクト指向の考え方を理解する -

◆◆ ヘルパー ヘルパー (( お助け)関数お助け)関数

クラス名::メンバ関数名        // 関数の具体的な内容の定義{      関数の呼び出し(...);

クラス名::メンバ関数名        // 関数の具体的な内容の定義{      関数の呼び出し(...);

C言語関数の定義    ※(注) 識別子の有効範囲が異なるため          この中ではクラスのメンバ変数やメンバ関数は          使用できない.          

C ++のメンバ関数の中でも,Cの関数を補助的に使える

ヘルパー関数

VC++ でプログラミングするときの一般的な注意

Page 29: オブジェクト指向プログラミングの概要     ー オブジェクト指向の考え方を理解する -

◆ 呼出し可能なメンバ関数と継承性を利用して上位クラスのアクセス          を制御する Private,Protected,Public   

Private

Protected

Public

変数群メンバ

関数群メンバ

Private

Protected

Public

Class A Class A

Class B Class B上位のクラス

クラス内部でのみアクセスは可

外部からのアクセス

外部からのアクセス 変数群メンバ

関数群メンバ

変数群メンバ

関数群メンバ

外部からのクラス アクセス

変数群メンバ

関数群メンバ

変数群メンバ

関数群メンバ

変数群メンバ

関数群メンバ

継承によるアクセス

継承によるアクセス

継承によるアクセス

外部からのクラス アクセス

完全に外部から隠される

Page 30: オブジェクト指向プログラミングの概要     ー オブジェクト指向の考え方を理解する -

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

Page 31: オブジェクト指向プログラミングの概要     ー オブジェクト指向の考え方を理解する -

【補足【補足 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のインスタンス

インスタンスを生成する領域クライアント対応

Page 32: オブジェクト指向プログラミングの概要     ー オブジェクト指向の考え方を理解する -

【 補 足【 補 足 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 のインスタンスを生成する

ダイアログボックス

対応