💖has a💖の関係を用いて ゲームキャラクターが持ち物を持っていることを表現することができます
ソーラー「今日はゲーム内に登場させるゲームキャラクターが
持ち物を持っているということを表現してみたいと思います」
マックス「もちものを誰が所有しているかをあらわすことができるってことか」
ソーラー「
そうなんです
とりあえず
ゲーム内に登場するアイテム
を
取り扱うためのオブジェクトを生成するための
クラスItemと
そのメンバ関数ItemDataDisplay()の定義を
作製してみたいと思います」
👇
class Item{
public:
string itemname;
public:
void itemDataDisplay();
};
void Item::itemDataDisplay() {
cout << itemname << "\n";
}
ソーラー「そして
クラスItemが用いられたプログラムは以下のようになります」
#include <iostream>
#include <string>//文字列を取り扱うためにヘッダファイル <string>をインクルードしています
using namespace std;
class Item {
public:
string itemname;
public:
void itemDataDisplay();
};
void Item::itemDataDisplay() {
cout << itemname << "\n";
}
int main() {
Item kakinotane;
kakinotane.itemname = "柿の種";
kakinotane.itemDataDisplay();
return 0;
}
ビルド実行結果
柿の種
マックス「・・・
くっくっ
柿の種
が表示されたか」
ソーラー「
そして
クラスGameCharacterとそのメンバ関数statusDataDisplay()の定義は
以下のように設定します
今までの
クラスGameCharacterとそのメンバ関数statusDataDisplay()の定義
から
ちょっと変更されているよ
どこだかわかるかな?」
👇
class GameCharacter {
public:
string name;
int HP;
int MP;
Item item;//👈ここです
void statusDataDisplay();
};
void GameCharacter::statusDataDisplay() {
cout << name << "\n";
cout << "HP " << HP << "\n";
cout << "MP " << MP << "\n";
cout <<name<< "のもちもの" << item.itemname<< "\n";//👈ここです
}
マックス「なんだ?
クラスGameCharacterのクラス宣言に
なんか
itemのItem型のオブジェクト宣言
Item item;
が設定されている
しかも
クラスGameCharacterのメンバ関数statusDataDisplay()の定義に
cout <<name<< "のもちもの" << item.itemname<< "\n";//👈
が追加されたか
なんだ
ど~いうことだ・・・・・」
👇
class GameCharacter {
public:
string name;
int HP;
int MP;
Item item;//👈ここです
void statusDataDisplay();
};
void GameCharacter::statusDataDisplay() {
cout << name << "\n";
cout << "HP " << HP << "\n";
cout << "MP " << MP << "\n";
cout <<name<< "のもちもの" << item.itemname<< "\n";//👈ここです
}
ソーラー「
これで
ゲームキャラクターであるリリアーネは
持ち物を所有することができることを
プログラムを用いて表現することができるようになります
つまり
持ち物を誰が所有しているかをあらわすことができるようになるんです」
そのことを示すプログラムはこちらです
👇
#include <iostream>
#include <string>//文字列を取り扱うためにヘッダファイル <string>をインクルードしています
using namespace std;
class Item {
public:
string itemname;
public:
void itemDataDisplay();
};
void Item::itemDataDisplay() {
cout << itemname << "\n";
}
class GameCharacter {
public:
string name;
int HP;
int MP;
Item item;//👈ここです
void statusDataDisplay();
};
void GameCharacter::statusDataDisplay() {
cout << name << "\n";
cout << "HP " << HP << "\n";
cout << "MP " << MP << "\n";
cout <<name<< "のもちもの " << item.itemname << "\n";//👈ここです
}
int main() {
GameCharacter Lyliane;
Lyliane.name = "リリアーネ";
Lyliane.HP = 10;
Lyliane.MP = 8;
Lyliane.item.itemname= "柿の種";
Lyliane.statusDataDisplay();
return 0;
}
ビルド実行結果
HP 10
MP 8
リリアーネのもちもの 柿の種
マックス「
GameCharacter Lyliane;
で
GameCharacter型のオブジェクトLylianeを生成している
そうして
ゲームキャラクターであるリリアーネのステータスデータ
名前 リリアーネ
HP 10
MP 8
を
オブジェクトLylianeのメンバ変数
Lyliane.name
Lyliane.HP
Lyliane.MP
に
Lyliane.name = "リリアーネ";
Lyliane.HP = 10;
Lyliane.MP = 8;
と
代入しているわけだ
で
Lyliane.item.itemname= "柿の種";
は何が行われているのかということなんだが・・」
ソーラー「
Lyliane.item.itemname= "柿の種";
は
ゲームキャラクターであるリリアーネの持ち物である
柿の種
の名前を
オブジェクトLylianeのメンバ変数
Lyliane.item.itemname
に代入しています
Lylianeのメンバオブジェクトが
Lyliane.itemで
Lylianeのメンバオブジェクト
Lyliane.itemのメンバ変数が
Lyliane.item.itemname
となっています
Lyliane.item.itemname= "柿の種";
が実行されている状態は
リリアーネのもちものが柿の種であるということを
あらわしています
Lyliane.item.itemname= "柿の種";
が実行された後
Lyliane.item.itemnameに何もデータを代入しなければ
リリアーネのもちものはずっと
柿の種ということになります
となると
この状態から
リリアーネが何も持ち物を持っていない状態を表現するためには
Lyliane.item.itemname= " ";
を実行すればよいことになります
そのプログラムはこちらです
👇
#include <iostream>
#include <string>//文字列を取り扱うためにヘッダファイル <string>をインクルードしています
using namespace std;
class Item {
public:
string itemname;
public:
void itemDataDisplay();
};
void Item::itemDataDisplay() {
cout << itemname << "\n";
}
class GameCharacter {
public:
string name;
int HP;
int MP;
Item item;//👈ここです
void statusDataDisplay();
};
void GameCharacter::statusDataDisplay() {
cout << name << "\n";
cout << "HP " << HP << "\n";
cout << "MP " << MP << "\n";
cout << name << "のもちもの " << item.itemname << "\n";//👈ここです
}
int main() {
GameCharacter Lyliane;
Lyliane.name = "リリアーネ";
Lyliane.HP = 10;
Lyliane.MP = 8;
Lyliane.MP = 8;
Lyliane.item.itemname = "柿の種";
Lyliane.statusDataDisplay();
Lyliane.item.itemname = " ";
Lyliane.statusDataDisplay();
return 0;
}
ビルド実行結果
HP 10
MP 8
リリアーネのもちもの 柿の種
HP 10
MP 8
リリアーネのもちもの
//🌞リリアーネのもちものに何も表示されなくなりました
ソーラー「このように
GameCharacterのクラス宣言内に
別のクラス宣言Item item;
を設定して
キャラクターが持ち物を持っていることを表現することができます
このときの
クラスGameCharacter
と
クラスItem
の関係を
💖has aの関係💖
といいます
Lyliane.item.itemname の構造は
クラスGameCharacter型のオブジェクトLylianeが
子クラスItem型のオブジェクトitemを管理していることになります
ですので
Lyliane.item.itemnameにアクセスして
Lyliane.item.itemnameに格納されているデータを変更するには
もちろん
GameCharacter Lyliane;
を実行し
Lyliane.item.itemname
を作製する必要があります
kakinotaneのクラスItem型のオブジェクト宣言
Item kakinotane;
kakinotane.itemname = "柿の種";
を実行しただけでは
柿の種がリリアーネの持ちものであることを表現することはできませんが
GameCharacterのクラス宣言内に
クラス宣言Item item;
を設定することにより
LylianeのクラスGameCharacter型のオブジェクト宣言
GameCharacter Lyliane;
Lyliane.item.itemname = "柿の種";
を実行して
柿の種がリリアーネの持ちものであることを表現することができています」
マックス「?
もしや・・・
??
GameCharacterのクラス宣言内に
別のクラス宣言Item item;
を設定してみたら
😊たまたま😊
リリアーネの持ち物が
柿の種であることを表現することが
できるようになったってことなんじゃないかあ?」
ソーラー「うぅ ぐぅぅ
す、するどい
そう
GameCharacterのクラス宣言内に
別のクラス宣言Item item;
を設定してみたら
😊たまたま😊
リリアーネの持ち物が
柿の種であることを表現することが
できるようになったんです😊
まあ
Lyliane.item.itemname = "柿の種";
が実行されている以上
Lyliane.statusDataDisplay();
を実行すれば
ビルド実行結果
HP 10
MP 8
リリアーネのもちもの 柿の種
が
表示されるのですから
コマンドプロンプト画面を見ている人は
リリアーネが柿の種をもっているようにみえるわけです」
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます