同じ名前のオブジェクト名を使って親クラスと子クラスのオブジェクト宣言を同時に行うことはできません

つづき(´▽`*)


#include <iostream>

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

using namespace std;


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

class GameCharacter {


public:

string name;

int HP;

int MP;

int AP;

void statusDataDisplay();


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

};



void GameCharacter::statusDataDisplay() {


cout << name << "\n";

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

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

cout << "AP " << AP << "\n";

}





//👇ここに注目🌞🌞🌞クラスGameCharacterを継承したクラスHumanです🌞🌞🌞


class Human:public GameCharacter {

public:

void useSuperMarket();


};



void Human::useSuperMarket() {

cout << name << "はスーパーマーケットにいった" << "\n";

cout << name << "は小豆バーをみつけた" << "\n";

HP += 10;


cout << name << "のHPは10回復した!" << "\n";


}


int main() {


GameCharacter Lyliane;


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

Lyliane.HP = 10;

Lyliane.MP = 8;

Lyliane.AP = 5;


Lyliane.statusDataDisplay();


return 0;

}


プログラムの実行結果


リリアーネ

HP 10

MP 8

AP 5


マックス「このプログラムでは


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


GameCharacter Lyliane;


がおこなわれているだろう


クラスGameCharacter型のオブジェクトLylianeが作製されると


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


Lyliane.name

Lyliane.HP

Lyliane.MP

Lyliane.AP


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


Lyliane.statusDataDisplay()


が生成されるわけだ。



ところでこれとは別に


親クラスGameCharacterから


子クラスHumanへクラスの継承を行っているので



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


Human Lyliane;


を実行して


クラスHuman型のオブジェクトLylianeが作製されると


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


Lyliane.name

Lyliane.HP

Lyliane.MP

Lyliane.AP


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


Lyliane.statusDataDisplay()


が生成されるわけだ。



ということはだ・・・


同時に


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


GameCharacter Lyliane;


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


Human Lyliane;


を実行した場合


同じ名前の

オブジェクトLylianeのメンバ変数


Lyliane.name

Lyliane.HP

Lyliane.MP

Lyliane.AP


オブジェクトLylianeのメンバ関数


Lyliane.statusDataDisplay()


が生成されることになるだろう。


つまり


同時に


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


GameCharacter Lyliane;


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


Human Lyliane;


を実行した場合



〇   〇   〇   〇   〇   〇   〇


クラスGameCharacter型の

オブジェクトLylianeのメンバ変数


Lyliane.name

Lyliane.HP

Lyliane.MP

Lyliane.AP


クラスGameCharacter型の

オブジェクトLylianeのメンバ関数


Lyliane.statusDataDisplay()


〇   〇   〇   〇   〇   〇   〇   〇


□   □   □   □   □   □   □   □


クラスHuman型の

オブジェクトLylianeのメンバ変数


Lyliane.name

Lyliane.HP

Lyliane.MP

Lyliane.AP


クラスHuman型の

オブジェクトLylianeのメンバ関数


Lyliane.statusDataDisplay()


□   □   □   □   □   □   □   □


作製されているというわけだ。」



          むふふ  ほんとかな?



マックス「となると


この状態で


Lyliane.name

Lyliane.HP

Lyliane.MP

Lyliane.AP

リリアーネのステータスデータ


リリアーネという名前

HP 10

MP 8

AP 5



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

Lyliane.HP = 10;

Lyliane.MP = 8;

Lyliane.AP = 5;



と代入した場合


親クラスGameCharacter型の

オブジェクトLylianeのメンバ変数


Lyliane.name

Lyliane.HP

Lyliane.MP

Lyliane.AP

リリアーネのステータスデータ


リリアーネ(という名前)

HP 10

MP 8

AP 5

は代入されることになるのか?


それとも


子クラスHuman型の

オブジェクトLylianeのメンバ変数


Lyliane.name

Lyliane.HP

Lyliane.MP

Lyliane.AP


リリアーネのステータスデータ


リリアーネ(という名前)

HP 10

MP 8

AP 5

は代入されることになるのか?


コンパイラは判断できるのか?」


ソーラー「わ、す、するどい


う~~ん う~~~むぅ


リリアーネのステータスデータ


リリアーネ(という名前)

HP 10

MP 8

AP 5


親クラスGameCharacter

子クラスHuman


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


Lyliane.name

Lyliane.HP

Lyliane.MP

Lyliane.AP


に代入されているのか?


ですか・・・


とりあえず


同時に


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


GameCharacter Lyliane;


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


Human Lyliane;


を実行して


親クラスGameCharacter型の

オブジェクトLylianeのメンバ変数


Lyliane.name

Lyliane.HP

Lyliane.MP

Lyliane.AP




子クラスHuman型の

オブジェクトLylianeのメンバ変数


Lyliane.name

Lyliane.HP

Lyliane.MP

Lyliane.AP

を作製し


Lyliane.name

Lyliane.HP

Lyliane.MP

Lyliane.AP

リリアーネのステータスデータ


リリアーネ(という名前)

HP 10

MP 8

AP 5

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

Lyliane.HP = 10;

Lyliane.MP = 8;

Lyliane.AP = 5;


と代入するプログラムを実行してみましょう。


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

👇


#include <iostream>

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

using namespace std;


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

class GameCharacter {


public:

string name;

int HP;

int MP;

int AP;

void statusDataDisplay();


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

};



void GameCharacter::statusDataDisplay() {


cout << name << "\n";

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

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

cout << "AP " << AP << "\n";

}





//👇ここに注目🌞🌞🌞クラスGameCharacterを継承したクラスです🌞🌞🌞


class Human :public GameCharacter {

public:

void useSuperMarket();


};



void Human::useSuperMarket() {

cout << name << "はスーパーマーケットにいった" << "\n";

cout << name << "は小豆バーをみつけた" << "\n";

HP += 10;


cout << name << "のHPは10回復した!" << "\n";


}


int main() {


GameCharacter Lyliane;


Human Lyliane;


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

Lyliane.HP = 10;

Lyliane.MP = 8;

Lyliane.AP = 5;


Lyliane.statusDataDisplay();


Lyliane.statusDataDisplay();


return 0;

}


プログラムの実行結果


エラー C2371 'Lyliane': 再定義されています。異なる基本型です。



ソーラー「なあんだ 意外と簡単な結果だったね。


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


GameCharacter Lyliane;


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

Human Lyliane;


を同時に行って


同じ名前のオブジェクトLylianeを作製することはできないんだね。」



😊  😊  😊  😊  😊  😊  😊  😊  😊


このようにプロトタイプオブジェクトである


ゲームキャラクター


リリアーネのデータを


取り扱う際には


どのクラスを用いてとりあつかうか?


つまり


どのクラス型のオブジェクトLylianeを用いて取り扱うかを


決める必要があるのですね


いいかえると


ゲームキャラクター


リリアーネのデータを


取り扱う際には


どの設計図(クラス)を用いてとりあつかうか?


どの設計図(クラス)を用いて作製された


オブジェクトLylianeを用いて取り扱うかを


決める必要があるのですね


どのクラスをもちいるかによって


どれくらい具体的に


プロトタイプオブジェクトである


ゲームキャラクター


リリアーネのデータを


取り扱うことができるかが決まってきます


つまり


ゲームキャラクター


リリアーネ


を表現できるかがきまってきます


クラスをつくりこんでいけば


仮想空間の中に


まるで本当に生きているかのような


ゲームキャラクター


リリアーネを表現できるようになります


(⋈◍>◡<◍)。✧♡



               solarplexussより


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

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

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

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

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