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

その他特徴 おっとり


が表示される・・・って




      🌞🌞🌞そんなことあたりまえのことか~い🌞🌞🌞



ソーラー「そう


      🌞🌞🌞あたりまえのことなんです🌞🌞🌞



これにてお話は終了かな?」




            🌞はい 終了です🌞




マックス「


じゃあ


サニーちゃん

その他特徴だけを


 おっとり


にして


リリーナちゃん

その他特徴は


遊ぶの大好き! 


オデットちゃん

その他特徴は


遊ぶの大好き! 



のままにするようにするにはどうしたらいいんだ?」



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

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

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

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

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