一部のプログラムを変更すると全体のプログラムも同時に手作業で修正することは避けたいというのがオブジェクト指向の基本的な考え方の1つに含まれています

今度はクラスGameCharacterに羽をはばたかせてHPを回復させるメンバ関数を設定せず新たに別のクラスFairyを創設しそこに羽をはばたかせてHPを回復させるメンバ関数を設定してみたいと思います

つづき・・・




クラスGameCharacter



クラスDragonが用いられた次のプログラムをご覧ください

👇


#include <iostream>

#include <string>//文字列を取り扱うためにヘッダファイル <string>をインクルードしています

using namespace std;


//👇🌞🌞🌞クラスGameCharacterです🌞🌞🌞

class GameCharacter {


public:

string name;

int HP;

int MP;


void statusDataDisplay();


//クラスGameCharacterにはuseFireRecovery(GameCharacter& a)を設定しません

};



void GameCharacter::statusDataDisplay() {


cout << name << "\n";

cout << "HP " << HP << "\n";

cout << "MP " << MP << "\n";

}



//👇🌞🌞🌞クラスDragonです🌞🌞🌞

class Dragon {


public:

string name;

int HP;

int MP;


void statusDataDisplay();


void useFireRecovery(GameCharacter& a);


};



void Dragon::statusDataDisplay() {


cout << name << "\n";

cout << "HP " << HP << "\n";

cout << "MP " << MP << "\n";

}


void Dragon::useFireRecovery(GameCharacter& a) {

cout << name << "は灼熱のフレアを" << a.name << "に吐いた !" << "\n";

cout << a.name << "は灼熱のフレアを受け燃え上がった!" << "\n";


a.HP += 10;


cout << a.name << "の体力は10回復した" << "\n";


}



int main() {


GameCharacter Lyliane;


Lyliane.name = "リリアーネ";

Lyliane.HP = 10;

Lyliane.MP = 8;


Dragon Pokky;

Pokky.name = "ポッキー";

Pokky.HP = 15;

Pokky.MP = 5;


Lyliane.statusDataDisplay();

Pokky.statusDataDisplay();


Pokky.useFireRecovery(Lyliane);


Lyliane.statusDataDisplay();

Pokky.statusDataDisplay();



return 0;

}


プログラムの実行結果


リリアーネ

HP 10

MP 8

ポッキー

HP 15

MP 5

ポッキーは灼熱のフレアをリリアーネに吐いた!

リリアーネは灼熱のフレアを受け燃え上がった!

リリアーネの体力は10回復した

リリアーネ

HP 20

MP 8

ポッキー

HP 15

MP 5



てんC「なるほど


クラスGameCharacterに


火を吐くという


属性を設定してしまうと


ドラゴン(Dragon)型のキャラクターだけでなく


人間(Human)型のキャラクター 

妖精(Fairy)型のキャラクター 


いえ もっと言えば


すべてのタイプのキャラクターも


火🔥を吐いて


火を吐いて火を吐かれた側のキャラクターのHPを回復させる


ファイヤーフレア


を使うことができるようになってしまうのですね


そこで


クラスGameCharacter

とは


            🔥別の🔥


     🔥火を吐くという属性を持つクラスDragon🔥


創設したのですね」


ソーラー「ここで注目してほしいのは


クラスGameCharacterのクラス宣言は


👇で


//👇🌞🌞🌞クラスGameCharacterです🌞🌞🌞

class GameCharacter {


public:

string name;

int HP;

int MP;


void statusDataDisplay();


};

👆


クラスDragonのクラス宣言は


👇

class Dragon {


public:

string name;

int HP;

int MP;


void statusDataDisplay();

void useFireRecovery(GameCharacter& a);


};

👆

となっているところです」


ぶーにゃん「注目したにゃ~んん」


マックス「注目したにゃ」


マックス「なんか


クラスGameCharacter

クラスDragon

のクラス宣言はとても似ているな


どちらのクラス宣言にも


クラスのメンバ変数宣言


string name;

int HP;

int MP;


クラスのメンバ関数宣言

void statusDataDisplay();


設定されているな~


のどかでいいんじゃないか?」


ソーラー「そう、のどかでいいな~と僕もおもうんだ~


今度は


🐤妖精(Fairy)タイプ🐤のキャラクターには


羽をはばたかせて相手のキャラクターのHPを回復させる


名づけて


        フェザーウィンドヒーリング


という

独自の能力をもたせたい、

行動をとることができるようにしたいと思ったとします


そこで


クラスGameCharacterとは別に


新たに


クラスFairyを創設したいと思います



Fairyのクラス宣言内には


クラスFairyのメンバ変数宣言


string name;

int HP;

int MP;


クラスFairyのメンバ関数宣言

void statusDataDisplay();


につづいて


🐤妖精(Fairy)タイプ🐤のキャラクターの


羽をはばたかせて相手のキャラクターのHPを回復させる


ということを可能にする


クラスFairyのメンバ関数宣言


void useFeatherWindHealing(GameCharacter& a);

(Featherは羽、Windは風、Healingは癒しという意味です)


を付け加えてみたいと思います


Fairyのクラス宣言は


class Fairy{


public:

string name;

int HP;

int MP;


void statusDataDisplay();


void useFeatherWindHealing(GameCharacter& a);



};


となります


クラスFairyのメンバ関数


void useFeatherWindHealing(GameCharacter& a)の定義は


void Fairy::useFeatherWindHealing(GameCharacter& a) {


cout << name << "は羽をはばたかせた"<< "\n";

a.HP += 8;


cout << a.name << "のHPは8回復した!" << "\n";


}


とします」




マックス「クラスFairyにも


妖精のキャラクターのステータスを表示するために


クラスGameCharacterの時と同じく


クラスFairyのメンバ変数宣言


string name;

int HP;

int MP;


クラスFairyのメンバ関数宣言

void statusDataDisplay();


が必要ってわけだ」



ソーラー「そうなんです


もちろんこのような


🐤妖精(Fairy)タイプ🐤のキャラクター


の属性を


つまり


メンバ関数


useFeatherWindHealing(GameCharacter& a)



クラスGameCharacterの属性として設定するのはよくありません


メンバ関数


useFeatherWindHealing(GameCharacter& a)



クラスGameCharacterに設定してしまうと


他の種族のタイプのキャラクターも


羽をはばたかせて相手のキャラクターのHPを回復させる


フェザーウィンドヒーリングを使うことができるようになってしまいます


例えば

人間(Human)型のキャラクター リリアーネも

妖精(Fairy)型のキャラクター シルフィも


羽をはばたかせて相手のキャラクターのHPを回復させる

フェザーウィンドヒーリングを使うことができるようになってしまいます


さてっと


それでは😊


クラスFairyが用いられたプログラムを実行してみたいと思います」


👇


#include <iostream>

#include <string>//文字列を取り扱うためにヘッダファイル <string>をインクルードしています

using namespace std;


//👇🌞🌞🌞クラスGameCharacterです🌞🌞🌞

class GameCharacter {


public:

string name;

int HP;

int MP;


void statusDataDisplay();


//クラスGameCharacterにはuseFireRecovery(GameCharacter& a)を設定しません

};



void GameCharacter::statusDataDisplay() {


cout << name << "\n";

cout << "HP " << HP << "\n";

cout << "MP " << MP << "\n";

}



//👇🌞🌞🌞クラスFairyです🌞🌞🌞


class Fairy {


public:

string name;

int HP;

int MP;


void statusDataDisplay();


void useFeatherWindHealing(GameCharacter& a);


};



void Fairy::statusDataDisplay() {


cout << name << "\n";

cout << "HP " << HP << "\n";

cout << "MP " << MP << "\n";

}


void Fairy::useFeatherWindHealing(GameCharacter& a) {

cout << name << "は羽をはばたかせた"<< "\n";

a.HP += 8;


cout << a.name << "のHPは8回復した!" << "\n";


}



int main() {


GameCharacter Lyliane;


Lyliane.name = "リリアーネ";

Lyliane.HP = 10;

Lyliane.MP = 8;


Fairy Shilphy;

Shilphy.name = "シルフィ";

Shilphy.HP = 6;

Shilphy.MP = 35;


Lyliane.statusDataDisplay();

Shilphy.statusDataDisplay();


Shilphy.useFeatherWindHealing(Lyliane);


Lyliane.statusDataDisplay();

Shilphy.statusDataDisplay();



return 0;

}


プログラムの実行結果


リリアーネ

HP 10

MP 8

シルフィ

HP 6

MP 36

シルフィは羽をはばたかせた

リリアーネのHPは8回復した

リリアーネ

HP 18

MP 8

シルフィ

HP 6

MP 36


ソーラー「やったね!


羽をはばたかせて相手のキャラクターのHPを回復させる


フェザーウィンドヒーリング


の成功です!」


マックス「おお そのようだな


う~む・・・なんか・・


なんだが


クラスGameCharacter と


クラスFairy


の両方を記述しているので


プログラムが長くなるな( ^ω^)・・・」


(クラスをヘッダファイルに格納しておいて


そのクラスを使用したいときは


ヘッダファイルをインクルードするというのが一般的ですが


ここでは


学習のため


すべてのクラスを記述する方法をとっています)



  • Twitterで共有
  • Facebookで共有
  • はてなブックマークでブックマーク

作者を応援しよう!

ハートをクリックで、簡単に応援の気持ちを伝えられます。(ログインが必要です)

応援したユーザー

応援すると応援コメントも書けます

新規登録で充実の読書を

マイページ
読書の状況から作品を自動で分類して簡単に管理できる
小説の未読話数がひと目でわかり前回の続きから読める
フォローしたユーザーの活動を追える
通知
小説の更新や作者の新作の情報を受け取れる
閲覧履歴
以前読んだ小説が一覧で見つけやすい
新規ユーザー登録無料

アカウントをお持ちの方はログイン

カクヨムで可能な読書体験をくわしく知る