ゲームの裏技の仕組みの一つにセッター関数が実行されるより前にゲッター関数が実行されるように誘導するというものがあります

とくにオブジェクトのメンバ変数にデータを代入することが目的の関数をセッター関数 、オブジェクトのメンバ変数に格納されたデータを取得することが目的の関数を ゲッター関数 というんだよ

ソーラー「クラスGameCharacterのメンバ変数のアクセス指定子が


privateになっていても


クラスGameCharacterのメンバ関数として


セッター関数を設定しておけば


main関数内でオブジェクトを生成したときに


オブジェクトのメンバ関数を用いて


オブジェクトのメンバ変数にデータを代入することができます


さらに


クラスGameCharacterのメンバ関数として


ゲッター関数を設定しておけば


オブジェクトのメンバ変数に格納されたデータを


取得することができます」


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

👇

#include <iostream>

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

using namespace std;


class GameCharacter {


private:


string name;

int HP;

int MP;


public:



void setData(string a, int b, int c);


string getData_name();


int getData_HP();


int getData_MP();




void statusDataDisplay();


};




void GameCharacter::statusDataDisplay() {


cout << name << "\n";

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

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

}



void GameCharacter::setData(string a, int b, int c) {


name = a;

HP = b;

MP = c;


}


string GameCharacter::getData_name() {


return name;


}



int GameCharacter::getData_HP() {


return HP;


}


int GameCharacter::getData_MP() {


return MP;


}



int main() {


GameCharacter Lyliane;

//🌞LylianeのGameCharacter型のオブジェクト宣言を実行しています🌞


Lyliane.setData("リリアーネ", 10, 50);


cout << Lyliane.getData_name() << "\n";

cout << "HP " << Lyliane.getData_HP() << "\n";

cout << "MP " << Lyliane.getData_MP() << "\n";


return 0;

}



ビルド実行結果


リリアーネ

HP 10

MP 50


マックス「


リリアーネ

HP 10

MP 50


を表示するんだったら


Lyliane.statusDataDisplay();


を実行すればいいだけなんじゃないか?


ソーラー「いいところを。。。


そう


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


オブジェクトのメンバ変数にアクセスすることができるんです


オブジェクトのセッター関数

オブジェクトのゲッター関数だけが


オブジェクトのメンバ変数にアクセスできるわけではありません


とくに


オブジェクトのメンバ変数にデータを代入することが目的の関数を


セッター関数


オブジェクトのメンバ変数に格納されたデータを取得することが目的の関数を


ゲッター関数


というんだね


結局のところ


クラスのメンバ関数として


セッター関数

ゲッター関数を


設定しておけば


クラスのメンバ変数のアクセス指定子が


privateになっていても


オブジェクトのメンバ変数にデータを代入することができ


オブジェクトのメンバ変数に格納されたデータを取得することができるというわけです」


マックス「さらに


オブジェクトのメンバ変数に代入できるデータに制限をかけることができるように


セッター関数の定義を設定できるんだろう」


ソーラー「そうなんだ😊


そして


オブジェクトのメンバ変数に格納されているデータを変更したくなければ


ゲッター関数だけを設定すればいいことになります


セッター関数を設定しなければ


オブジェクトのメンバ変数に格納されているデータを変更することはできなくなります」


マックス「オブジェクトのメンバ変数に格納されているデータを変更したくなければ


ゲッター関数だけを設定すればいいことになります


セッター関数を設定しなければ


オブジェクトのメンバ変数に格納されているデータを変更することはできなくなる・・・か・・・


だが


これだと


そもそも


オブジェクトのメンバ変数にデータを格納することができないんじゃないか?」


ソーラー「ここで登場するのが


コンストラクタというわけです


オブジェクトを生成したときに


自動的に


オブジェクトのコンストラクタが実行されることになりますが


クラスのコンストラクタはクラスのメンバ関数なので


クラスのメンバ変数のアクセス指定子が


privateになっていても


オブジェクトのコンストラクタは


オブジェクトのメンバ変数にアクセスすることができます


ですので


main関数内で


オブジェクト宣言を行い


オブジェクトを生成するとき


オブジェクトのコンストラクタが実行されますが


コンストラクタの定義で


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


データが代入できるよう設定しておけば


オブジェクトのメンバ変数に自動的にデータを代入することができるというわけです


それに


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


            最初から


          適切な(笑)データを代入しておけば


オブジェクトのゲッター関数でデータを取得し


その取得したデータが利用された関数が実行されるとき


あらかじめ自分で設定したデータなので


それほど


バグの生じた意味不明な結果にならないというわけです


もし


クラスのメンバ関数として


コンストラクタを設定していなければ


オブジェクトのコンストラクタが実行されず


オブジェクトのメンバ変数にデータが代入されていなければ


その


オブジェクトのメンバ変数にはなんだかよくわからないデータが代入されているので



オブジェクトのゲッター関数でデータを取得し


そのデータが利用された関数が実行されるとき


とんでもないことが起こる(笑)かもしれないね」


マックス「😊たとえば


Lyliane.HPが初期化されていなければ


Lyliane.HPに81845356が格納されていたりするんだろう?


となると


コマンドプロンプト画面に表示される


リリアーネのHPは


予期せぬ値


81845356


になったりするわけだ😊



あれっ これって


もしや



            裏技



ってやつじゃないか」



ソーラー「確かに


セッター関数が実行される前に


ゲッター関数が実行されるように誘導できたなら


オブジェクトのメンバ変数は初期化されていないため


ゲッター関数は初期化されていないデータを


取得することになるわけだね」


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

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

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

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

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