🌞main関数内で🌞オブジェクト宣言されたオブジェクトを 🌞main関数の外で定義された🌞クラスのメンバ関数の引数に代入するとオブジェクトの格納しているデータだけが💖値渡し💖されることになります

ドラゴンタイプ、妖精タイプのゲームキャラクターのデータをクラスGameCharacterを用いて取り扱ってみたいと思います が限界もあります

ソーラー「


クラスGameCharacterのクラス宣言内には


登場するゲームキャラクターに共通する


つまり


登場するゲームキャラクターなら必ず持っている


名前

HP

MP

データを


取り扱うための


メンバ変数宣言

string name;

int HP;

int MP;

メンバ関数宣言

void statusDataDisplay();


が設定されていました


このクラスGameCharacterを用いて


リリアーネという名前のゲームキャラクターのデータ

(プロトタイプオブジェクトのデータ)


を取り扱うことができました


そのプログラムはこちらです

👇


#include <iostream>

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

using namespace std;


class GameCharacter {


public:

string name;

int HP;

int MP;

void statusDataDisplay();


};




void GameCharacter::statusDataDisplay() {


cout << name << "\n";

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

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

}


int main() {


GameCharacter Lyliane;

//🌞LylianeのGameCharacter型のオブジェクト宣言を実行しています🌞

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

Lyliane.HP = 10;

Lyliane.MP = 50;


Lyliane.statusDataDisplay();


return 0;

}


プログラムの実行結果


リリアーネ

HP 10

MP 50


ソーラー「このプログラムで取り扱っているのは



リリアーネという名前のゲームキャラクターなんです



💖プロトタイプオブジェクト= 対象としてみるモノ💖



リリアーネという名前のゲームキャラクターというわけです


リリアーネという名前のゲームキャラクターは


GameCharacterのカテゴリーに属しているので


💖プロトタイプオブジェクト= 対象としてみるモノ💖


のデータ


つまり


リリアーネという名前のゲームキャラクターのデータは


GameCharacterという名前のクラスによって取り扱われているというわけです



このプログラムでは


LylianeのクラスGameCharacter型のオブジェクト宣言


GameCharacter Lyliane;


を実行し


クラスGameCharacter型のオブジェクトLylianeを生成しています



そして


クラスGameCharacter型のオブジェクトLylianeのメンバ変数


Lyliane.name

Lyliane.HP

Lyliane.MP



💖プロトタイプオブジェクト= 対象としてみるモノ💖


のデータ


つまり


リリアーネという名前のゲームキャラクターのデータ

👇

リリアーネという名前

HP 10

MP 50

👆

を格納しています


そして


クラスGameCharacter型のオブジェクトLylianeのメンバ関数


Lyliane.statusDataDisplay()


を用いて


それらのデータを


コマンドプロンプト画面に表示しています


このプログラムでは


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

Lyliane.HP = 10;

Lyliane.MP = 50;


の実行により


クラスGameCharacter型のオブジェクトLylianeのメンバ変数


Lyliane.name

Lyliane.HP

Lyliane.MP


"リリアーネ"

10

50


が代入されています」


ソーラー「ところで


今は


リリアーネという名前のゲームキャラクターの


名前

HP

MP

データを


取り扱うために


LylianeのクラスGameCharacter 型のオブジェクト宣言


GameCharacter Lyliane;


を実行しました


実は


リリアーネという名前のゲームキャラクターは💖人間(Human)タイプ💖なんです


今度は


ドラゴンタイプであるポッキーというゲームキャラクターを


クラスGameCharacterをもちいて取り扱ってみたいと思います


ポッキーというゲームキャラクターは


名前 ポッキー

HP 100

MP 70


というデータをもっているとします


さあ プログラムはどうなるでしょうか?


そのプログラムはこちらです

👇


#include <iostream>

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

using namespace std;


class GameCharacter {


public:

string name;

int HP;

int MP;

void statusDataDisplay();


};




void GameCharacter::statusDataDisplay() {


cout << name << "\n";

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

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

}


int main() {


GameCharacter Pokky;

//🌞PokkyのGameCharacter型のオブジェクト宣言を実行しています🌞

Pokky.name = "ポッキー";

Pokky.HP = 100;

Pokky.MP = 70;


Pokky.statusDataDisplay();


return 0;

}


プログラムの実行結果


ポッキー

HP 100

MP 70


今度は


妖精(Fairy)タイプであるシルフィというゲームキャラクターを


クラスGameCharacterをもちいて取り扱ってみたいと思います


シルフィというゲームキャラクターは


名前 シルフィ

HP 2

MP 500


というデータをもっているとします


さあ プログラムはどうなるでしょうか?


そのプログラムはこちらです

👇


#include <iostream>

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

using namespace std;


class GameCharacter {


public:

string name;

int HP;

int MP;

void statusDataDisplay();


};




void GameCharacter::statusDataDisplay() {


cout << name << "\n";

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

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

}


int main() {


GameCharacter Sylphy;

//🌞SylphyのクラスGameCharacter型のオブジェクト宣言を実行しています🌞


Sylphy.name = "シルフィ";

Sylphy.HP = 2;

Sylphy.MP = 500;


Sylphy.statusDataDisplay();


return 0;

}


プログラムの実行結果


シルフィ

HP 2

MP 500


ソーラー「以上の3つのプログラムでは


💖人間(Human)タイプ💖のリリアーネという名前のゲームキャラクター


🐉ドラゴン(Dragon)タイプ🐉のポッキーという名前のゲームキャラクター


🐤妖精(Fairy)タイプ🐤のシルフィという名前のゲームキャラクター



クラスGameCharacterで取り扱ってきましたが


💖人間(Human)タイプ💖のリリアーネという名前のゲームキャラクター


🐉ドラゴン(Dragon)タイプ🐉のポッキーという名前のゲームキャラクター


🐤妖精(Fairy)タイプ🐤のシルフィという名前のゲームキャラクター



同じクラスGameCharacterで取り扱うには限界があります


例えば


💖人間(Human)タイプ💖のキャラクターには


自分を応援し自分のHPを回復させる


名づけて


          セルフエイド




🐉ドラゴン(Dragon)タイプ🐉のキャラクターは


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


名づけて


          ファイヤーフレア


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


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


名づけて


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


など


それぞれの種族ごとに


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


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



そこで


🐉ドラゴン(Dragon)タイプ🐉のキャラクターの


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


ということを可能にする


クラスGameCharacterのメンバ関数宣言は


void useFireRecovery(GameCharacter& a);

(Fireは火、Recoveryは回復という意味です)


とし


その定義は


void GameCharacter::useFireRecovery(GameCharacter& a){


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


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


a.HP += 10;


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


}


としたいところですが・・・」


マックス「としたいところですが・・・」


ソーラー「このような


🐉ドラゴン(Dragon)タイプ🐉のキャラクター


の属性を


つまり


メンバ関数


useFireRecovery(GameCharacter& a)



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


メンバ関数


useFireRecovery(GameCharacter& a)



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


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


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


ファイヤーフレアを使うことができるようになってしまいます


例えば

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

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


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


ファイヤーフレアを使うことができるようになってしまいます


まずは次のプログラムをみてほしいな」

👇


#include <iostream>

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

using namespace std;


class GameCharacter {


public:

string name;

int HP;

int MP;


void statusDataDisplay();


void useFireRecovery(GameCharacter a);



};



void GameCharacter::statusDataDisplay() {


cout << name << "\n";

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

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

}


void GameCharacter::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;


GameCharacter 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//🌞HPが回復がしています!

MP 8

ポッキー

HP 15

MP 5


マックス「おお・・・


リリアーネが燃え上がっとるぅ


燃え上がっとるぅ


なんて設定なんだ」


ソーラー「このような設定はまだ序の口です」


マックス「な、何かいったか?」


ソーラー「いえ😊


ところで


このプログラムでは


ドラゴン(Dragon)型のキャラクターのポッキーの攻撃


ファイヤーフレア


により


リリアーネのHPが10回復しています」


マックス「なんだ


プログラムは


うまく機能しているんじゃないか?」


ソーラー「たしかに


ドラゴン(Dragon)型のキャラクターのポッキーの能力


ファイヤーフレア


により


リリアーネの体力が10回復していますが


このクラスGameCharacterの設定だと


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


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


ファイヤーフレア


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


そのことを示すプログラムはこちらです

👇

#include <iostream>

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

using namespace std;


class GameCharacter {


public:

string name;

int HP;

int MP;



void statusDataDisplay();

void useFireRecovery(GameCharacter& a);



};



void GameCharacter::statusDataDisplay() {


cout << name << "\n";

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

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

}


void GameCharacter::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;


GameCharacter Pokky;

Pokky.name = "ポッキー";

Pokky.HP = 15;

Pokky.MP = 5;


Lyliane.statusDataDisplay();

Pokky.statusDataDisplay();


Lyliane.useFireRecovery(Pokky);


Lyliane.statusDataDisplay();

Pokky.statusDataDisplay();



return 0;

}


プログラムの実行結果


リリアーネ

HP 10

MP 8

ポッキー

HP 15

MP 5

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

ポッキーは灼熱のフレアを受け燃え上がった!

ポッキーの体力は10回復した

リリアーネ

HP 10

MP 8

ポッキー

HP 25//🌞HP回復!

MP 5


マックス「リリアーネが火を吐いた!


ドラゴン(Dragon)型のキャラクターのポッキーが燃え上がっとるぅ


な、なんか・・


このリリアーネってキャラクターやばくないか・・


もっと


清楚なキャラクターだと思っていたんだが( ̄▽ ̄;)」


てんC「なるほど


クラスGameCharacterに


火を吐くという


属性を設定してしまうと


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


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

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


いえ もっと言えば


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


火を吐いて


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


ファイヤーフレア


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




マックス「ところで



クラスGameCharacterのメンバ関数宣言は


void useFireRecovery(GameCharacter& a);

(Fireは火、Recoveryは回復という意味です)


とし


その定義は


void GameCharacter::useFireRecovery(GameCharacter& a){

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

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


a.HP += 10;


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


}


となっているが


なぜ


GameCharacter& a


なんだ??


GameCharacter a


ではだめなのか?」


solarplexuss 「ほんと、そうだ」

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

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

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

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

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