そもそも親クラスのメンバ変数のアクセス指定子が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💖💖💖



なんです」

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

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

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

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

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