SDI アプリケーションでクラスを作る

せっかくC++を使っているので、クラスを使いましょう。
SDIアプリを開発中のときは、VC++がクラスの作成をサポートしています。
挿入 >> クラスの新規作成 を選択します。



クラスの新規作成ダイアログがでるので、クラスの種類をGeneric クラスにします。
MFCクラスを選択すると、MFCクラスを継承したクラスを作ることができます。

クラス名には CBackDraw クラス名は先頭にCをつける約束でしたね。
基本クラスは、空白のままでOKです。


ファイル名の「変更(c)」ボタンを押すとファイルの変更ダイアログがでてクラスを作るファイルの名前を変更することが出来ます。
通常は、クラス名と同じ名前のファイルが新しく作られます。

わざわざクラス名と違う名前をつけて混乱に拍車をかけるのはどうでしょうか。
おすすめ出来ませんね。

また、ファイルの変更ダイアログで参照を使ってすでにあるファイル名を指定するとそのファイルの中に新しいクラスのソースを作ります。
フレンドクラスや、小さなクラスがたくさんある場合など、一つのファイルにまとめると扱いやすくなるでしょう。

ファイルをどのように分割するか、というのは結構後々まで悩むものです。

クラス名を入れると、OKボタンが押せるようになるので、OKボタンを押します。
クラスビューを見てみましょう。


ちゃんと新しいクラスが出来ています。
四角で囲まれたコンストラクタをダブルクリックすると、ソースファイルが開きます。
クラス名をダブルクリックすると、ヘッダファイルが開きます。

ここでクラス名を間違えた!!、などという場合は、ファイルビューからクラス名の追加ソースファイルとヘッダファイルを削除します。
ファイルビューからファイルを選択して編集 >> 削除 で削除します。

ビルドするとき、他ファイルでインクルードしているときは、そちらも削除しないと下のようなリンクのエラーがでます。

 rpgView.obj : error LNK2001: 外部シンボル ""public: virtual __thiscall BackDraw::~BackDraw(void)"
 (??1BackDraw@@UAE@XZ)" は未解決です

他のファイルの中で複数のクラスを定義しているときは、自分で削除しなくてはなりません。
そのときは、ソースファイルと、ヘッダファイルの中から削除するクラスに関する記述をすべて消します。
ビルドすると、VC++はクラスがなくなったのを理解してクラスビューからそのクラスがなくなります。

出来たクラスをrpgViewから使えるようにするためには、ヘッダファイルをインクルードする必要があります。

rpgView.cppファイルの頭の方にインクルードしましょう。
こんな感じです。
 

 // rpgView.cpp : CRpgView
 //クラスの動作の定義を行います。
 #include "stdafx.h"
 #include "rpg.h"
 
 #include "rpgDoc.h"
 #include "rpgView.h"
 
 #include "BackDraw.h"
 

ちゃんと使えるようになったか確認します。
キーハンドラの部分にクラスのインスタンスを作成してみます。
 

////////////////////////////////////////////////////////////
 // CRpgView クラスのメッセージ ハンドラ
 void CRpgView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
 {
 // TODO: この位置にメッセージ ハンドラ用のコードを追加するかまたはデフォルトの処理を呼び出してください
 CBackDraw BackDraw1;
 
 switch (nChar){
 case VK_RIGHT:
  posi_x +=32;
 

ビルドします。
エラーは出ませんでしたね。
このクラスの中味は空なので、エラーが出ないのかもしれません。
メンバ変数を作ってアクセスしてみます。

クラスのテキストをまじめに読んでいた人はクラスのメンバ変数を定義するのは簡単でしょう。
public 部分に int m_TestHensu;

と定義します。

ちょっとここではVC++の機能を使って定義してみましょう。

クラスビューの CDrawBAck でマウスの右ボタンを押します。



VC++の機能によってクラスにメンバ変数とメンバ関数を定義することができます。

では、public なメンバ変数を作ってみます。
メンバ変数は あたまに m_ をつけるんでしたね。



変数の型は int 型 名前は m_TestHensu としましょう。
OKを押します。

まずちゃんと変数が作られているか確認します。
クラスビューから、CDrawBackをダブルクリックすると、ヘッダファイルが表示されます。
そこに、

int m_TestHensu;

と出ていればOKですね。

ここでメンバ変数を削除してみます。
それからビルドすると、クラスビューの中に表示されている m_TestHens も消えます。

続けて自分でメンバ変数を作ってからビルドすると、再びクラスビューでそのメンバ変数を確認することができます。

つまり、VC++はソースを作るのと、ワークスペースで管理しやくする、という二つの働きをしてくれているわけです。
自分でメンバ変数を作ってもまったく問題はありません。

C言語では、ファイルとファイルの関係を気にしてコーディングしていましたがC++、とくにVC++は、クラスとクラスの関係のほうが重視されると思います。
慣れるにしたがって、ファイルビューではなく、クラスビューを見ながらプログラムするようになります。

これでSDIインターフェースのプロジェクトでクラスを作る方法を理解しました。
つぎは背景をクラスにして使ってみます。