🌻天国にいけるC++言語入門🌻 進化し続けるオブジェクト指向プログラミング ver3.2307
とくにオブジェクトのメンバ変数にデータを代入することが目的の関数をセッター関数 、オブジェクトのメンバ変数に格納されたデータを取得することが目的の関数を ゲッター関数 というんだよ
ゲームの裏技の仕組みの一つにセッター関数が実行されるより前にゲッター関数が実行されるように誘導するというものがあります
とくにオブジェクトのメンバ変数にデータを代入することが目的の関数をセッター関数 、オブジェクトのメンバ変数に格納されたデータを取得することが目的の関数を ゲッター関数 というんだよ
ソーラー「クラス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
になったりするわけだ😊
あれっ これって
もしや
裏技
ってやつじゃないか」
ソーラー「確かに
セッター関数が実行される前に
ゲッター関数が実行されるように誘導できたなら
オブジェクトのメンバ変数は初期化されていないため
ゲッター関数は初期化されていないデータを
取得することになるわけだね」
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます