🌻天国にいけるC++言語入門🌻 進化し続けるオブジェクト指向プログラミング ver3.2307
Visual Studio2018 2019以降 両対応版 ゲームキャラクターの複製をつくるときにはご用心 代入演算子=のオーバーロードはどのようなときにおこなわれるのでしょうか?
Visual Studio2018 2019以降 両対応版 ゲームキャラクターの複製をつくるときにはご用心 代入演算子=のオーバーロードはどのようなときにおこなわれるのでしょうか?
このエピソードの内容は
Visual Studio2018
Visual Studio2018以降のヴァージョンであるVisual Studio2019などに対応しており
すべてのプログラムを実行することができます
ソーラー「それでは
今日は
妖精さんタイプのゲームキャラクターのデータを
クラスを用いて取り扱ってみたいと思います」
マックス「ほほう?」
ソーラー「えへへ 今日はたくさん妖精さんに登場してもらおうと思うんだ
妖精さんタイプの
同じステータスデータをもつ
ゲームキャラクターの複製をおこなっていくことになるんだけど
そのときに面白いことがおこることがあるんだよ」
マックス「同じステータスデータをもつ
ゲームキャラクターの複製??
ど~いうことぉ?」
ソーラー「例えばHP,MPも全く同じ妖精さん
FairyA
FairyB
FairyC
が生成される場合
なんかに
面白いことがおこることがあるんです」
マックス「面白いことって俺のことか😊?」
ソーラー「・・・ほかにも
原理的には同じですが
自分と同じステータスをもつキャラクター
を生成する場合も
面白いことがおこることがあるんです・・・」
マックス「どうやら キャラクターの複製の話が関係してくるようだが・・・
面白いことなんておこるのか?」
ソーラー「う~ん ちょくちょくみかけるかな?
それでは はじめてみようよ
まあ、まずは
妖精さんのステータスデータを取り扱うための
Fairyクラスの作製からはじめてみようかな
FairyAさんではさみしいから
サニーちゃん
リリーナちゃん
オデットちゃん
という名前の妖精さんに登場してもらおうかな
サニーちゃん
リリーナちゃん
オデットちゃん
という名前のゲームキャラクターは
妖精というカテゴリーに属しているので
クラス名は
Fairyに設定します
(クラス名は最初の1文字目は
Fairy👈最初の1文字目は大文字F
のように
最初の1 文字を大文字にするというのが慣例になっています)
そしてまず
サニーちゃん
という名前のゲームキャラクターは
サニーちゃんという名前
HP(体力)1
MP( 精霊エネルギー力)100
その他特徴 遊ぶの大好き
というデータをもっているとします」
マックス「おっ その他特徴か
新しい項目だな」
ソーラー「そうだね
そこで
サニーちゃんという名前
HP(体力)1
MP( 精霊エネルギー力)100
その他特徴 遊ぶの大好き
のデータを取り扱うために
クラスFairyのクラス宣言にメンバ変数宣言
string name;
int HP;
int MP;
char* i;
を設定してみたいと思います
そうなると
Fairyのクラス宣言は
class Fairy{
string name;
int HP;
int MP;
char* i;
};
となります
そして
サニーちゃんという名前
HP(体力)1
MP( 精霊エネルギー力)100
その他特徴 遊ぶの大好き
というステータスデータを取り扱うための
クラスGameCharacterのメンバ変数
name
HP
MP
i
に続いて
サニーちゃんという名前
HP(体力)1
MP( 精霊エネルギー力)100
その他特徴 遊ぶの大好き!
をコマンドプロンプト画面に表示するために
クラスGameCharacterのメンバ変数
name
HP
MP
i
を用いて
クラスGameCharacterのメンバ関数を設定してみたいと思います
その関数の名前はstatusDataDisplayにしますね
(関数の名前の付け方は最初の1文字目はstatusのsのように小文字
Data
Display
のように
単語ごとに
最初の1 文字を大文字にするというのが慣例になっています
status👈最初の1文字目は小文字s
Data👈最初の1文字目は大文字D
Display👈最初の1文字目は大文字D
このように設定することで
statusDataDisplay
が
クラス名でなく関数名であることを分かりやすくしているというわけです
)
そして
statusDataDisplayのクラスFairyのメンバ関数宣言は
void statusDataDisplay();
とし
クラスFairyのメンバ関数statusDataDisplay()
の定義は
void Fairy::statusDataDisplay(){
cout << name << "\n";
cout << "HP " << HP << "\n";
cout << "MP " << MP<<"\n";
cout << "その他特徴 " << i<<"\n";//🌞このiの使い方が気になりますね
}
とします
さっそく
この
クラスFairy
と
メンバ関数statusDataDisplay()の定義が
もちいられたプログラムを実行してみましょう
楽しみですね」
#include <iostream>
#include <string>//文字列を取り扱うためにヘッダファイル <string>をインクルードしています
using namespace std;
class Fairy{
public:
string name;
int HP;
int MP;
char* i;
void statusDataDisplay();
};
void Fairy::statusDataDisplay(){
cout << name << "\n";
cout << "HP " << HP << "\n";
cout << "MP " << MP<<"\n";
cout << "その他特徴 " << i<<"\n";
}
int main() {
Fairy Sunny;
//🌞SunnyのFairy型のオブジェクト宣言を実行しています🌞
Sunny.name = "サニーちゃん";
Sunny.HP = 1;
Sunny.MP = 100;
Sunny.i= new char[50];
strcpy_s(Sunny.i, 50, "遊ぶの大好き!");
//👆🌞ポインタ変数を用いて文字列データをメモリに格納するSunny.i="遊ぶの大好き!";を実行することはできないので、代わりの命令文を実行しています
Sunny.statusDataDisplay();
return 0;
}
ビルド実行結果
Visual Studio2018の場合
Visual Studio2019以降のヴァージョンの場合
サニーちゃん
HP 1
MP 100
その他特徴 遊ぶの大好き!
が表示されます
マックス「な、なんか
キャラクターデータを取り扱ってる感がでてるじゃないか!
HPと1
MPと100
の間に空白部分が設置されているじゃないか
ゲーム画面ぽくなってきた!」
てんC「
サニーちゃんという名前のゲームキャラクターのデータ
👇
サニーちゃんという名前
HP(体力)1
MP( 精霊エネルギー力)100
その他特徴 遊ぶの大好き!
を
クラスFairy型のオブジェクトSunnyを用いて取り扱うことができていますね
サニーちゃんのデータをとりあつかうので
クラスFairy型のオブジェクトの名前をSunnyに設定しているのですね」
ソーラー「ここで
今度は
リリーナという名前の妖精のデータを
クラスFairyを用いて取り扱ってみたいと思います
リリーナという名前のゲームキャラクターは
リリーナという名前
HP(体力)1
MP( 精霊エネルギー力)100
その他特徴 遊ぶの大好き!
というデータをもっているとします」
マックス「なんか サニーちゃんとリリーナちゃんで
名前以外はステータスデータが一緒じゃないか」
ソーラー「そうなんです
そこで
クラスFairy型のオブジェクトLillynaを用いて
リリーナという名前の妖精のデータを取り扱って行きたいと思うのですが
サニーちゃんとリリーナちゃんはほぼデータ内容が一緒なので
クラスFairy型のオブジェクトSunnyを生成した後
クラスFairy型のオブジェクトLillynaに
クラスFairy型のオブジェクトSunny
を代入して
クラスFairy型のオブジェクトLillynaのメンバ変数
に
クラスFairy型のオブジェクトSunnyのメンバ変数
が
持っているデータを代入してみたいと思います
#include <iostream>
#include <string>//文字列を取り扱うためにヘッダファイル <string>をインクルードしています
using namespace std;
class Fairy{
public:
string name;
int HP;
int MP;
char* i;
void statusDataDisplay();
};
void Fairy::statusDataDisplay(){
cout << name << "\n";
cout << "HP " << HP << "\n";
cout << "MP " << MP<<"\n";
cout << "その他特徴 " << i<<"\n";
}
int main() {
Fairy Sunny;
//🌞SunnyのFairy型のオブジェクト宣言を実行しています🌞
Sunny.name = "サニーちゃん";
Sunny.HP = 1;
Sunny.MP = 100;
Sunny.i= new char[50];
strcpy_s(Sunny.i, 50, "遊ぶの大好き!");
Sunny.statusDataDisplay();
Fairy Lillyna;
Lillyna=Sunny;
Sunny.statusDataDisplay();
return 0;
}
Visual Studio2018の場合
Visual Studio2019以降のヴァージョンの場合
ビルド実行結果
サニーちゃん
HP 1
MP 100
その他特徴 遊ぶの大好き!
サニーちゃん
HP 1
MP 100
その他特徴 遊ぶの大好き!
マックス「折角クラスFairy型のオブジェクトLillynaをもちいているのに
クラスFairy型のオブジェクトLillyna
に
クラスFairy型のオブジェクトSunnyが代入される
Lillyna=Sunny;
が実行されているので
Lillyna.name =Sunny.name
が実行され
Lillyna.nameに文字列データ
"サニーちゃん"
が代入されているじゃないか
なので
リリーナの名前までがサニーちゃんになっているぞ」
ソーラー「あ、そうですね
Lillyna=Sunny;
の実行後
Lillyna.name = "リリーナちゃん";
を実行して
名前はリリーナちゃんにしないとね
そのプログラムはこちらです
👇
#include <iostream>
#include <string>//文字列を取り扱うためにヘッダファイル <string>をインクルードしています
using namespace std;
class Fairy{
public:
string name;
int HP;
int MP;
char* i;
void statusDataDisplay();
};
void Fairy::statusDataDisplay(){
cout << name << "\n";
cout << "HP " << HP << "\n";
cout << "MP " << MP<<"\n";
cout << "その他特徴 " << i<<"\n";
}
int main() {
Fairy Sunny;
//🌞SunnyのFairy型のオブジェクト宣言を実行しています🌞
Sunny.name = "サニーちゃん";
Sunny.HP = 1;
Sunny.MP = 100;
Sunny.i= new char[50];
strcpy_s(Sunny.i, 50, "遊ぶの大好き!");
Sunny.statusDataDisplay();
Fairy Lillyna;
Lillyna=Sunny;
Lillyna.name = "リリーナちゃん";
Lillyna.statusDataDisplay();
return 0;
}
ビルド実行結果
Visual Studio2018の場合
Visual Studio2019以降のヴァージョンの場合
サニーちゃん
HP 1
MP 100
その他特徴 遊ぶの大好き!
リリーナちゃん
HP 1
MP 100
その他特徴 遊ぶの大好き!
マックス「ほほう
遊ぶの大好き!
な妖精が増えたってわけだ」
ソーラー「今度はオデットという妖精に登場してもらいましょう
そのプログラムはこちらです
👇
#include <iostream>
#include <string>//文字列を取り扱うためにヘッダファイル <string>をインクルードしています
using namespace std;
class Fairy{
public:
string name;
int HP;
int MP;
char* i;
void statusDataDisplay();
};
void Fairy::statusDataDisplay(){
cout << name << "\n";
cout << "HP " << HP << "\n";
cout << "MP " << MP<<"\n";
cout << "その他特徴 " << i<<"\n";
}
int main() {
Fairy Sunny;
//🌞SunnyのFairy型のオブジェクト宣言を実行しています🌞
Sunny.name = "サニーちゃん";
Sunny.HP = 1;
Sunny.MP = 100;
Sunny.i= new char[50];
strcpy_s(Sunny.i, 50, "遊ぶの大好き!");
Sunny.statusDataDisplay();
Fairy Lillyna;
Lillyna=Sunny;
Lillyna.name = "リリーナちゃん";
Lillyna.statusDataDisplay();
Fairy Odette;
Odette=Sunny;
Odette.name = "オデットちゃん";
Odette.statusDataDisplay();
return 0;
}
ビルド実行結果
Visual Studio2018の場合
サニーちゃん
HP 1
MP 100
その他特徴 遊ぶの大好き!
リリーナちゃん
HP 1
MP 100
その他特徴 遊ぶの大好き!
オデットちゃん
HP 1
MP 100
その他特徴 遊ぶの大好き!
マックス「おおう、どんどん遊ぶの大好き!な
妖精がふえているな」
ソーラー「
サニーちゃん
HP 1
MP 100
その他特徴 遊ぶの大好き!
リリーナちゃん
HP 1
MP 100
その他特徴 遊ぶの大好き!
オデットちゃん
HP 1
MP 100
その他特徴 遊ぶの大好き!
仲良し妖精ってわけだね(*^▽^*)
ここで
サニーちゃんの
💖その他特徴だけ💖を
おっとり
に変更したいと思います
どうしたらいいと思うかな?」
マックス「にゃははは
サニーちゃんの
💖その他特徴だけ💖
をか?
そんなんでいいのか?
そんなの簡単だろう
いまのこのプログラムでは
クラスFairy型のオブジェクトSunnyのメンバ変数
Sunny.i
を用いて
Sunny.i = new char[50];
を実行して
動的にメモリ領域を確保し
strcpy_s(Sunny.i, 50, "遊ぶの大好き!");
を実行して
動的に確保したメモリ領域に
文字列データ "遊ぶの大好き!"
を格納しているわけだ
そのとき
文字列データ "遊ぶの大好き!"
を格納している動的に確保したメモリ領域の先頭のメモリのアドレスが
クラスFairy型のオブジェクトSunnyのメンバ変数
Sunny.i
に格納されているんだろう
で
そのメモリ領域に
"おっとり"
という文字列データを代入するには
strcpy_s関数を用いて
strcpy_s(Sunny.i, 50, "おっとり");
を実行すればいいってわけだ
フハハ 簡単だな」
ソーラー「よく
strcpy_s関数の使い方を覚えていたね
そう
strcpy_s関数をもちいれば
strcpy_s関数の
第1引数のポインタ変数の格納しているアドレスのメモリを先頭とするメモリ領域にあてて
第3引数に記述されている文字列データを
格納することができましたね
それでは
strcpy_s関数を用いて
strcpy_s(Sunny.i, 50, "おっとり");
を実行し
サニーちゃんの
💖その他特徴だけ💖を
おっとり
に変更したいと思います
そのプログラムはこちらです」
👇
#include <iostream>
#include <string>//文字列を取り扱うためにヘッダファイル <string>をインクルードしています
using namespace std;
class Fairy{
public:
string name;
int HP;
int MP;
char* i;
void statusDataDisplay();
};
void Fairy::statusDataDisplay(){
cout << name << "\n";
cout << "HP " << HP << "\n";
cout << "MP " << MP<<"\n";
cout << "その他特徴 " << i<<"\n";
}
int main() {
Fairy Sunny;
//🌞SunnyのFairy型のオブジェクト宣言を実行しています🌞
Sunny.name = "サニーちゃん";
Sunny.HP = 1;
Sunny.MP = 100;
Sunny.i= new char[50];
strcpy_s(Sunny.i, 50, "遊ぶの大好き!");
Sunny.statusDataDisplay();
Fairy Lillyna;
Lillyna=Sunny;
Lillyna.name = "リリーナちゃん";
Lillyna.statusDataDisplay();
Fairy Odette;
Odette=Sunny;
Odette.name = "オデットちゃん";
Odette.statusDataDisplay();
strcpy_s(Sunny.i, 50, "おっとり");//👈🌞ここです
Sunny.statusDataDisplay();
Lillyna.statusDataDisplay();
Odette.statusDataDisplay();
return 0;
}
ビルド実行結果
サニーちゃん
HP 1
MP 100
その他特徴 遊ぶの大好き!
リリーナちゃん
HP 1
MP 100
その他特徴 遊ぶの大好き!
オデットちゃん
HP 1
MP 100
その他特徴 遊ぶの大好き!
サニーちゃん
HP 1
MP 100
その他特徴 おっとり
リリーナちゃん
HP 1
MP 100
その他特徴 おっとり
オデットちゃん
HP 1
MP 100
その他特徴 おっとり
マックス「どうだあ
余裕だろう
みろ
ビルド実行結果
サニーちゃん
HP 1
MP 100
その他特徴 遊ぶの大好き!
だったのが
ビルド実行結果
サニーちゃん
の
その他特徴 おっとり
に見事に変更されているだろう
めでたし めでたし」
ソーラー「といいたいところなんだけど・・・」
マックス「ははは
完璧過ぎてほめたりないってわけか
それも仕方がないこと・・・だな
そうか
完璧な知性を前に畏敬の念を抱くのも無理はない
いいだろう いいだろう
どんどん称賛していいぞ」
ソーラー「い、いや
ビルド実行結果を
もう一度ご覧ください」
👇
マックス「芸術的な結果をもう一度鑑賞したいのか
いいことだ」
👇
ビルド実行結果
サニーちゃん
HP 1
MP 100
その他特徴 遊ぶの大好き!
リリーナちゃん
HP 1
MP 100
その他特徴 遊ぶの大好き!
オデットちゃん
HP 1
MP 100
その他特徴 遊ぶの大好き!
サニーちゃん
HP 1
MP 100
その他特徴 おっとり
リリーナちゃん
HP 1
MP 100
その他特徴 おっとり
オデットちゃん
HP 1
MP 100
その他特徴 おっとり
マックス「うむうむ いいなあ これ・・・
うむうむ
・・
・・・て・・・
おや・・・
・・
サニーちゃん
HP 1
MP 100
その他特徴 遊ぶの大好き!
リリーナちゃん
HP 1
MP 100
その他特徴 遊ぶの大好き!
オデットちゃん
HP 1
MP 100
その他特徴 遊ぶの大好き!
👇
サニーちゃん
HP 1
MP 100
その他特徴 おっとり
リリーナちゃん
HP 1
MP 100
その他特徴 おっとり
オデットちゃん
HP 1
MP 100
その他特徴 おっとり
👆
の
👇この部分
サニーちゃん
HP 1
MP 100
その他特徴 おっとり
リリーナちゃん
HP 1
MP 100
その他特徴 おっとり
オデットちゃん
HP 1
MP 100
その他特徴 おっとり
👆
・・・
!?
なんだ!?
サニーちゃん
の
その他特徴 おっとり
はいいんだが
リリーナちゃん
の
その他特徴も
おっとり
オデットちゃん
の
その他特徴も
おっとり
になっているぞ
なぁんでだ
ぐぬ
ぐぬぬぅぅ」
ソーラー「
strcpy_s関数をもちいれば
strcpy_s関数の
第1引数のポインタ変数の格納しているアドレスのメモリを先頭とするメモリ領域にあてて
第3引数に記述されている文字列データを
格納することができましたね」
マックス「
そう だからこそ
strcpy_s関数を用いて
strcpy_s(Sunny.i, 50, "おっとり");
を実行し
第1引数のポインタ変数Sunny.iの格納しているアドレスのメモリを先頭とするメモリ領域にあてて
(Sunny.iをつかって動的に確保したメモリ領域にあてて)
文字列データ"おっとり"を格納することにより
サニーちゃんの
💖その他特徴だけ💖を
おっとり
に変更したんだ」
ソーラー「この
strcpy_s関数の
第1引数のポインタ変数の格納しているアドレスのメモリを先頭とするメモリ領域にあてて
第3引数に記述されている文字列データを
格納することができるというところがポイントなんです」
マックス「なんで~」
ソーラー「先ほどのプログラムでは
クラスFairy型のオブジェクトSunnyのメンバ変数
Sunny.i
を用いて
Sunny.i= new char[50];
を実行することにより動的にメモリを確保したのち
strcpy_s(Sunny.i, 50, "遊ぶの大好き!");
を実行し
文字列データ "遊ぶの大好き!"
を
Sunny.iを使って動的に確保したメモリ領域に格納しました
そのとき
文字列データ "遊ぶの大好き!"
を格納しているメモリ領域の先頭のメモリのアドレスが
クラスFairy型のオブジェクトLillynaのメンバ変数
Sunny.i
に格納されていますね
その後
Lillyna=Sunny;
Odette=Sunny;
を実行しているので
Lillyna.i=Sunny.i;
Odette.i=Sunny.i;
が実行されています
となると
文字列データ "遊ぶの大好き!"
を格納しているメモリ領域の先頭のメモリのアドレスが
クラスFairy型のオブジェクトLillynaのメンバ変数
Lillyna.i
クラスFairy型のオブジェクトOdetteのメンバ変数
Odette.i
に格納されていることになります
ここまではいいかな(*^▽^*)?
そして
Sunny.statusDataDisplay();
が実行されると
cout << Sunny.name << "\n";
cout << "HP " << Sunny.HP << "\n";
cout << "MP " <<Sunny.MP<<"\n";
cout << "その他特徴 " << Sunny.i<<"\n";//👈🌞ここです
が実行されて
コマンドプロンプト画面に
サニーちゃん
HP 1
MP 100
その他特徴 遊ぶの大好き!//👈🌞ここです
が表示されることになります」
マックス「おお いいじゃないか」
ソーラー「で
Lillyna.statusDataDisplay();
が実行されると
cout << Lillyna.name << "\n";
cout << "HP " << Lillyna.HP << "\n";
cout << "MP " << Lillyna.MP<<"\n";
cout << "その他特徴 " << Lillyna.i<<"\n";//👈🌞ここです
が実行されるのですが
Lillyna.i=Sunny.i;
が実行されているので
cout << "その他特徴 " << Lillyna.i<<"\n";//👈🌞ここです
は
cout << "その他特徴 " << Sunny.i<<"\n";//👈🌞ここです
が実行されることに等しくなり
コマンドプロンプト画面に
その他特徴 遊ぶの大好き!
が表示されることになります」
マックス「いいじゃないか」
ソーラー「で
Odette.statusDataDisplay();
が実行されると
cout << Odette.name << "\n";
cout << "HP " << Odette.HP << "\n";
cout << "MP " << Odette.MP<<"\n";
cout << "その他特徴 " << Odette.i<<"\n";//👈🌞ここです
が実行されるのですが
Odette.i=Sunny.i;
が実行されているので
cout << "その他特徴 " << Odette.i<<"\n";//👈🌞ここです
は
cout << "その他特徴 " << Sunny.i<<"\n";//👈🌞ここです
が実行されることに等しくなり
コマンドプロンプト画面に
その他特徴 遊ぶの大好き!
が表示されることになります」
マックス「おおう いいじゃないか」
ソーラー「さあて 準備完了ってところだね」
マックス「ほええ?」
ソーラー「
この状態で
文字列データ "遊ぶの大好き!"
を格納しているメモリ領域に
"おっとり"
という文字列データを代入するのに
strcpy_s関数を用いて
strcpy_s(Sunny.i, 50, "おっとり");
を実行すると
クラスFairy型のオブジェクトSunnyのメンバ変数
Sunny.i
が格納しているアドレスのメモリを先頭とするメモリ領域
に文字列データ"おっとり"
が格納されます
そのため
Sunny.statusDataDisplay();
が実行されると
cout << Sunny.name << "\n";
cout << "HP " << Sunny.HP << "\n";
cout << "MP " <<Sunny.MP<<"\n";
cout << "その他特徴 " << Sunny.i<<"\n";//👈🌞ここです
が実行されて
コマンドプロンプト画面に
その他特徴 おっとり
が表示されることになります」
マックス「おお いいじゃないか」
ソーラー「で
Sunny.statusDataDisplay();
の次に
Lillyna.statusDataDisplay();
が実行されると
cout << Lillyna.name << "\n";
cout << "HP " << Lillyna.HP << "\n";
cout << "MP " << Lillyna.MP<<"\n";
cout << "その他特徴 " << Lillyna.i<<"\n";//👈🌞ここです
が実行されるのですが
Lillyna.i=Sunny.i;
が実行されているので
cout << "その他特徴 " << Lillyna.i<<"\n";//👈🌞ここです
は
cout << "その他特徴 " << Sunny.i<<"\n";//👈🌞ここです
が実行されることに等しくなり
コマンドプロンプト画面に
その他特徴 おっとり
が表示されることになります」
マックス「な、なにぃ!
strcpy_s(Sunny.i, 50, "おっとり");
を実行しているだけなのにぃ」
ソーラー「で
Odette.statusDataDisplay();
が実行されると
cout << Odette.name << "\n";
cout << "HP " << Odette.HP << "\n";
cout << "MP " << Odette.MP<<"\n";
cout << "その他特徴 " << Odette.i<<"\n";//👈🌞ここです
が実行されるのですが
Odette.i=Sunny.i;
が実行されているので
cout << "その他特徴 " << Odette.i<<"\n";//👈🌞ここです
は
cout << "その他特徴 " << Sunny.i<<"\n";//👈🌞ここです
が実行されることに等しくなり
コマンドプロンプト画面に
その他特徴 おっとり
が表示されることになります」
マックス「
そんなことになっているのか
どうやら
Sunny.i
Lillyna.i
Odette.i
の格納しているアドレスが同じなため
strcpy_s(Sunny.i, 50, "おっとり");
を実行して
Sunny.iの格納しているアドレスのメモリを先頭とするメモリ領域に
文字列データ"おっとり"を格納して
Sunny.statusDataDisplay();
Lillyna.statusDataDisplay();
Odette.statusDataDisplay();
を実行した場合
すなわち
cout << Sunny.name << "\n";
cout << "HP " << Sunny.HP << "\n";
cout << "MP " <<Sunny.MP<<"\n";
cout << "その他特徴 " << Sunny.i<<"\n";//👈🌞ここです
cout << Lillyna.name << "\n";
cout << "HP " << Lillyna.HP << "\n";
cout << "MP " << Lillyna.MP<<"\n";
cout << "その他特徴 " << Lillyna.i<<"\n";//👈🌞ここです
cout << Odette.name << "\n";
cout << "HP " << Odette.HP << "\n";
cout << "MP " << Odette.MP<<"\n";
cout << "その他特徴 " << Odette.i<<"\n";//👈🌞ここです
を実行した場合
(注目ポイントは
👇
cout << "その他特徴 " << Sunny.i<<"\n";//👈🌞ここです
cout << "その他特徴 " << Lillyna.i<<"\n";//👈🌞ここです
cout << "その他特徴 " << Odette.i<<"\n";//👈🌞ここです
👆
です
)
ビルド実行結果
サニーちゃん
HP 1
MP 100
その他特徴 おっとり
リリーナちゃん
HP 1
MP 100
その他特徴 おっとり
オデットちゃん
HP 1
MP 100
その他特徴 おっとり
が表示される・・・って
🌞🌞🌞そんなことあたりまえのことか~い🌞🌞🌞
」
ソーラー「そう
🌞🌞🌞あたりまえのことなんです🌞🌞🌞
これにてお話は終了かな?」
🌞はい 終了です🌞
マックス「
じゃあ
サニーちゃん
の
その他特徴だけを
おっとり
にして
リリーナちゃん
の
その他特徴は
遊ぶの大好き!
オデットちゃん
の
その他特徴は
遊ぶの大好き!
のままにするようにするにはどうしたらいいんだ?」
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます