クラスのメンバ変数、メンバ関数のアクセス指定子が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に設定する場合の注意点😊ってわけだね」


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

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

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

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

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