🌻天国にいけるC++言語入門🌻 進化し続けるオブジェクト指向プログラミング ver3.2307
クラスのメンバ変数、メンバ関数のアクセス指定子がpublicに設定されている場合💖外部(別のクラス)💖からそのクラス型のオブジェクトのメンバ変数、メンバ関数にアクセスすることができます
クラスのメンバ変数、メンバ関数のアクセス指定子がpublicに設定されている場合💖外部(別のクラス)💖からそのクラス型のオブジェクトのメンバ変数、メンバ関数にアクセスすることができます
ソーラー「以前
ゲームキャラクター
リリアーネ
の防御力が
木の盾を装備することにより
2アップすることを
プログラムを用いて表現することができましたね
そのプログラムはこちらです
👇
#include <iostream>
#include <string>//文字列を取り扱うためにヘッダファイル <string>をインクルードしています
using namespace std;
class Shield {
public:
string shieldname;
int shieldDP;
public:
void shieldDataDisplay();
};
void Shield::shieldDataDisplay() {
cout << shieldname << "\n";
cout << "防御力 " << shieldDP << "\n";
}
class GameCharacter {
public:
string name;
int HP;
int MP;
int DP;
void setShield(Shield a);
void statusDataDisplay();
};
void GameCharacter::setShield(Shield a) {
DP = DP + a.shieldDP;
}
void GameCharacter::statusDataDisplay() {
cout << name << "\n";
cout << "HP " << HP << "\n";
cout << "MP " << MP << "\n";
cout << "DP " << DP << "\n";
}
int main() {
Shield WoodShiled;
WoodShiled.shieldname = "木の盾";
WoodShiled.shieldDP = 2;
GameCharacter Lyliane;
Lyliane.name = "リリアーネ";
Lyliane.HP=10;
Lyliane.MP=8;
Lyliane.DP=3;
Lyliane.statusDataDisplay();
Lyliane.setShield(WoodShiled);
//🌞リリアーネのDPが3から5に増加しました
Lyliane.statusDataDisplay();
return 0;
}
ビルド実行結果
リリアーネ
HP 10
MP 8
DP 3
リリアーネ
HP 10
MP 8
DP 5
マックス「にゃはははっ かっこいいプログラムじゃないか」
ソーラー「うまく2つのクラス
GameCharacter
と
Shield
が連携しています😊
ところで
今のプログラムで用いられた2つのクラス
クラスShield
と
クラスGameCharacter
に御注目下さい」
てんC「
😊2つのクラス😊
ですか」
ソーラー「そう
😊2つのクラス😊
です」
マックス「なんだ?
😊2つのクラス😊
になにか
あるのか?」
ソーラー「
クラスShieldと
そのメンバ関数shieldDataDisplay()の定義は
以下のように設定されていました
👇
class Shield{
public:
string shieldname;
int shieldDP;
public:
void shieldDataDisplay();
};
void Shield::shieldDataDisplay() {
cout << shieldname << "\n";
cout << "防御力 " << shieldDP << "\n";
}
そして
クラスGameCharacterのクラス宣言と
クラスGameCharacterのメンバ関数
setShield()
statusDataDisplay()
の定義は以下のように設定されていました
👇
class GameCharacter {
public:
string name;
int HP;
int MP;
int DP;//🌞メンバ変数宣言を付け加えました
void setShield();//🌞メンバ関数宣言を付け加えました
void statusDataDisplay();
};
void GameCharacter::setShield(Shield a) {
DP=DP+a.shieldDP;
}
void GameCharacter::statusDataDisplay() {
cout << name << "\n";
cout << "HP " << HP << "\n";
cout << "MP " << MP << "\n";
cout << "DP " << DP << "\n";
}
ソーラー「このときの
クラスGameCharacterのメンバ関数setShield(Shield a)
の定義
👇
void GameCharacter::setShield(Shield a) {
DP=DP+a.shieldDP;
}
に御注目下さい
クラスShield型のオブジェクトaのメンバ変数
a.shieldDP
が記述されているのにお気づきでしょうか?
マックス「記述されているな」
ソーラー「実は
クラスShield型のオブジェクトaのメンバ変数
a.shieldDP
を
記述できる場合とできない場合があるんです」
マックス「??なんでじゃ」
ソーラー「
クラスShieldのメンバ変数宣言
int shieldDP;
のアクセス指定子が
public
に設定されていると
クラスShield型のオブジェクトaのメンバ変数
a.shieldDP
が
💖別のクラスGameCharacterのメンバ関数setShield(Shield a)💖
の定義内で
👇
void GameCharacter::setShield(Shield a) {
DP=DP+a.shieldDP;
}
👆
上記のように
記述されていても
🌞ビルドエラーが表示されることはありません🌞
そして
クラスShield型のオブジェクトaのメンバ変数
a.shieldDP
の記述されている
🌞場所🌞は
クラスShieldとはちがう
クラスGameCharacterのメンバ関数setShield(Shield a)の定義内ですね
このことを
クラスShield型のオブジェクトaのメンバ変数shieldDPに
💖外部(別のクラスGameCharacter)💖
からアクセスしているといいます
ただし
クラスShield型のオブジェクトaのメンバ変数shieldDPに外部からアクセスできるのは
クラスShieldのメンバ変数宣言
int shieldDP;
のアクセス指定子が
public
に設定されている場合のみです
クラスShieldのメンバ変数宣言
int shieldDP;
のアクセス指定子が
private
の場合は
クラスGameCharacterのメンバ関数setShield(Shield a)
の定義
👇
void GameCharacter::setShield(Shield a) {
DP=DP+a.shieldDP;
}
内に
クラスShield型のオブジェクトaのメンバ変数shieldDP
を記述することはできません
このとき
クラスGameCharacterのメンバ関数setShield(Shield a)
の定義
👇
void GameCharacter::setShield(Shield a) {
DP=DP+a.shieldDP;
}
👆
内で
a.shieldDP
が
(#^^#)記述されているだけで(#^^#)
ビルドエラーが表示されることになります
もう一回繰り返すと
クラスShieldのメンバ変数宣言
int shieldDP;
のアクセス指定子が
以下のようにprivateに設定されていると
👇
class Shield{
public:
string shieldname;
private://🌞アクセス指定子をprivateに設定しています
int shieldDP;
public:
void shieldDataDisplay();
};
👆
ソーラー「
クラスGameCharacterのメンバ関数setShield(Shield a)
の定義
👇
void GameCharacter::setShield(Shield a) {
DP=DP+a.shieldDP;
}
内で
a.shieldDPを記述することはできません
なぜなら
aのクラスShield型のオブジェクト宣言
Shield a;
によって
オブジェクトa
が生成されたとしても
クラスShield型のオブジェクトaのメンバ変数shieldDPは生成されていても使用できなくなっているからです
クラスGameCharacterのメンバ関数setShield(Shield a)
の定義
👇
void GameCharacter::setShield(Shield a) {
DP=DP+a.shieldDP;
}
👆
内で
🍊a.shieldDP🍊
🍊が記述されているだけで🍊
ビルドエラーが表示されることになります
クラスGameCharacterのメンバ関数setShield(Shield a)
の定義
👇
void GameCharacter::setShield(Shield a) {
DP=DP+a.shieldDP;
}
のなかで
a.shieldDP
が記述されているだけでビルドエラーが表示されるので
もちろん
今のプログラムの
Lyliane.setShield(WoodShiled);
は
実行できなくなります」
そのことを示すプログラムはこちらです
👇
#include <iostream>
#include <string>//文字列を取り扱うためにヘッダファイル <string>をインクルードしています
using namespace std;
class Shield {
public:
string shieldname;
private://👈🌞ここに注目
int shieldDP;
public:
void shieldDataDisplay();
};
void Shield::shieldDataDisplay() {
cout << shieldname << "\n";
cout << "防御力 " << shieldDP << "\n";
}
class GameCharacter {
public:
string name;
int HP;
int MP;
int DP;
void setShield(Shield a);
void statusDataDisplay();
};
void GameCharacter::setShield(Shield a) {
DP = DP + a.shieldDP;
}
void GameCharacter::statusDataDisplay() {
cout << name << "\n";
cout << "HP " << HP << "\n";
cout << "MP " << MP << "\n";
cout << "DP " << DP << "\n";
}
int main() {
Shield WoodShiled;
WoodShiled.shieldname = "木の盾";
WoodShiled.shieldDP = 2;
GameCharacter Lyliane;
Lyliane.name = "リリアーネ";
Lyliane.HP=10;
Lyliane.MP=8;
Lyliane.DP=3;
Lyliane.statusDataDisplay();
Lyliane.setShield(WoodShiled);
//🌞リリアーネのDPが3から5に増加しました
Lyliane.statusDataDisplay();
return 0;
}
ビルド実行結果
重大度レベル コード 説明 プロジェクト ファイル 行 抑制状態
エラー C2248 'Shield::shieldDP': private メンバー (クラス 'Shield' で宣言されている) にアクセスできません。
エラー (アクティブ) E0265 メンバー "Shield::shieldDP" (宣言された 行 10) にアクセスできません
エラー (アクティブ) E0265 メンバー "Shield::shieldDP" (宣言された 行 10) にアクセスできません
エラー C2248 'Shield::shieldDP': private メンバー (クラス 'Shield' で宣言されている) にアクセスできません。
ソーラー「ビルド実行結果に
エラー C2248 'Shield::shieldDP': private メンバー (クラス 'Shield' で宣言されている) にアクセスできません。
が表示されましたね
クラスShieldのメンバ変数宣言のアクセス指定子が
以下のように
👇
private://🌞アクセス指定子をprivateに設定しています
int shieldDP;
👆
privateに設定されたため
クラスGameCharacterのメンバ関数setShield(Shield a)
の定義
👇
void GameCharacter::setShield(Shield a) {
DP = DP + a.shieldDP;
}
内の
a.shieldDP
は
生成されていても使用できないので
クラスGameCharacterのメンバ関数setShield(Shield a)
の定義内で
a.shieldDP
を用いることができず
ビルドエラーが生じることになったわけです
クラスのメンバ変数のアクセス指定子をprivateに設定する場合の注意点😊ってわけだね」
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます