🌻天国にいけるC++言語入門🌻 進化し続けるオブジェクト指向プログラミング ver3.2307
そもそも親クラスのメンバ変数のアクセス指定子がprivateの場合は子クラスのメンバ関数の定義内で親クラスのメンバ変数を用いることはできません
そもそも親クラスのメンバ変数のアクセス指定子がprivateの場合は子クラスのメンバ関数の定義内で親クラスのメンバ変数を用いることはできません
つづきです
てんC「
そもそも
親クラスのメンバ変数宣言のアクセス指定子がprivateに設定されている場合は
子クラスのメンバ関数の定義内で
親クラスのメンバ変数を用いることはできません
ですので
そのように記述されたプログラムを実行しようとすると
ビルドエラーが表示されることになります
先程登場したプログラムをご覧ください」
👇
#include <iostream>
#include <string>//文字列を取り扱うためにヘッダファイル <string>をインクルードしています
using namespace std;
class GameCharacter {
private://🌞ここに注目
string name;
int HP;
int MP;
public:
void statusDataDisplay();
};
void GameCharacter::statusDataDisplay() {
cout << name << "\n";
cout << "HP " << HP << "\n";
cout << "MP " << MP << "\n";
}
class Dragon :public GameCharacter {
public:
int DP;//👈ドラゴン型のキャラクターだけに備わっているドラゴンポイントです
public:
void setDragonStatusData(string a, int b, int c, int d);
void DragonstatusDataDisplay();
};
//👇🌞🌞🌞クラスDragonのメンバ関数setStatusData()の定義です🌞🌞🌞
void Dragon::setDragonStatusData(string a, int b, int c, int d) {
name = a;
HP = b;
MP = c;
DP = d;
}
//👇🌞🌞🌞クラスDragonのメンバ関数DragonstatusDataDisplay()の定義です🌞🌞🌞
void Dragon::DragonstatusDataDisplay() {
cout << name << "\n";
cout << "HP " << HP << "\n";
cout << "MP " << MP << "\n";
cout << "DP " << DP << "\n";
}
int main() {
return 0;
}
プログラムの実行結果
重大度レベル コード 説明 プロジェクト ファイル 行 抑制状態
エラー (アクティブ) E0265 メンバー "GameCharacter::name" (宣言された 行 8) にアクセスできません
エラー (アクティブ) E0265 メンバー "GameCharacter::name" (宣言された 行 8) にアクセスできません
エラー (アクティブ) E0265 メンバー "GameCharacter::MP" (宣言された 行 10) にアクセスできません
エラー (アクティブ) E0265 メンバー "GameCharacter::MP" (宣言された 行 10) にアクセスできません
エラー (アクティブ) E0265 メンバー "GameCharacter::HP" (宣言された 行 9) にアクセスできません
エラー (アクティブ) E0265 メンバー "GameCharacter::HP" (宣言された 行 9) にアクセスできません
エラー C2248 'GameCharacter::name': private メンバー (クラス 'GameCharacter' で宣言されている) にアクセスできません。
エラー C2248 'GameCharacter::name': private メンバー (クラス 'GameCharacter' で宣言されている) にアクセスできません。
エラー C2248 'GameCharacter::MP': private メンバー (クラス 'GameCharacter' で宣言されている) にアクセスできません。
エラー C2248 'GameCharacter::MP': private メンバー (クラス 'GameCharacter' で宣言されている) にアクセスできません。
エラー C2248 'GameCharacter::HP': private メンバー (クラス 'GameCharacter' で宣言されている) にアクセスできません。
エラー C2248 'GameCharacter::HP': private メンバー (クラス 'GameCharacter' で宣言されている) にアクセスできません。
エラー MSB6006 "CL.exe" はコード 2 を伴って終了しました。 C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\IDE\VC\VCTargets\Microsoft.CppCommon.targets 360
てんC「このように
親クラスGameCharacterのメンバ変数宣言
private://🌞ここに注目
string name;
int HP;
int MP;
の
アクセス指定子が
🌞private🌞
に設定されている場合は
子クラスDragonのメンバ関数の定義内で
親クラスGameCharacterのメンバ変数
name
HP
MP
が用いられていると
ビルドエラーが表示されることになります
このプログラムの場合
次の子クラスDragonの2つのメンバ関数の定義内で
👇
👇
//👇🌞🌞🌞クラスDragonのメンバ関数setStatusData()の定義です🌞🌞🌞
void Dragon::setDragonStatusData(string a, int b, int c, int d) {
name = a;
HP = b;
MP = c;
DP = d;
}
//👇🌞🌞🌞クラスDragonのメンバ関数DragonstatusDataDisplay()の定義です🌞🌞🌞
void Dragon::DragonstatusDataDisplay() {
cout << name << "\n";
cout << "HP " << HP << "\n";
cout << "MP " << MP << "\n";
cout << "DP " << DP << "\n";
}
👆
👆
親クラスGameCharacterのメンバ変数
name
HP
MP
が用いられているので
ビルドエラーが表示されることになります」
マックス「そう そう😊
親クラスGameCharacterのメンバ変数宣言
private://🌞ここに注目
string name;
int HP;
int MP;
の
アクセス指定子が
🌞private🌞
に設定されている場合は
子クラスDragonのクラス宣言内に
親クラスGameCharacterのメンバ変数宣言
string name;
int HP;
int MP;
は引き継がれないので
子クラスDragonのメンバ関数の定義内で以下のように
👇
👇
//👇🌞🌞🌞クラスDragonのメンバ関数setStatusData()の定義です🌞🌞🌞
void Dragon::setDragonStatusData(string a, int b, int c, int d) {
name = a;
HP = b;
MP = c;
DP = d;
}
//👇🌞🌞🌞クラスDragonのメンバ関数DragonstatusDataDisplay()の定義です🌞🌞🌞
void Dragon::DragonstatusDataDisplay() {
cout << name << "\n";
cout << "HP " << HP << "\n";
cout << "MP " << MP << "\n";
cout << "DP " << DP << "\n";
}
👆
👆
親クラスGameCharacterのメンバ変数
name
HP
MP
が用いられているだけで
ビルドエラーが表示去れるん(^^♪だったな😊
親クラスGameCharacterのメンバ変数のアクセス指定子をprivateに設定するのも考え物だな
ってあれ???
privateがだめ
となると
親クラスGameCharacterのメンバ変数宣言
string name;
int HP;
int MP;
のアクセス指定子はpublicに設定することになる・・・?
となると・・・
アクセス指定子はpublicなので
親クラスGameCharacterのメンバ変数宣言
string name;
int HP;
int MP;
は
子クラスDragonのクラス宣言内に引き継がれることになる
そうなってくると
main関数内で
Dragon Pokky;
を実行して
クラスDragon型のオブジェクトPokkyを作製したとき
Pokky.name
Pokky.HP
Pokky.MP
が生成される・・だろう?
そのとき
直接
Pokky.name
Pokky.HP
Pokky.MP
を使用して
Pokky.name = "ポッキー";
Pokky.HP = 20;
Pokky.MP = 3;
を実行することができる・・・
が
逆にいうと
直接
Pokky.name
Pokky.HP
Pokky.MP
を使用して
Pokky.name = "ポッキー";
Pokky.HP = 20;
Pokky.MP = 3;
ができてしまう・・・
カプセル化は不可能ってことにならないか?
だって
クラスの継承を行う場合
親クラスGameCharacterのメンバ変数宣言のアクセス指定子をprivateに設定した場合は
子クラスDragonのメンバ関数の定義内で
親クラスGameCharacterのメンバ変数
name
HP
MP
を用いただけで
ビルドエラーが表示されることになるからな
だからといって
親クラスGameCharacterのメンバ変数宣言のアクセス指定子をpublicに設定した場合は
Pokky.name = "ポッキー";
Pokky.HP = 20;
Pokky.MP = 3;
が実行できてしまう
??
どうやってカプセル化をおこなうんだ・・?」
ソーラー「そこで登場するのが
前のエピソードで登場した
アクセス指定子
💖💖💖protected💖💖💖
なんです」
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます