GetterとSetter
CoddyのC++ジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 28/104。
クラスメンバーが private の場合、外部コードはそれらに cannot access directly できません。Getters と セッター は、これらの非公開メンバーへの制御されたアクセスを提供する public メソッドです。ゲッターは値を取得し、セッターは値を変更します。
class Temperature {
double celsius; // プライベート - 直接アクセスできない
public:
// ゲッター - 値を返す
double getCelsius() const {
return celsius;
}
// セッター - 検証付きで値を変更する
void setCelsius(double value) {
if (value >= -273.15) { // 絶対零度のチェック
celsius = value;
}
}
};setter の本当の力は検証です。
任意の値の代入を許可する代わりに、ルールを適用できます。上の例では、絶対零度未満の温度は拒否されます。setter がなければ、誰でも無効なデータを直接代入できてしまいます。
Getterは返す前にデータを変換することもできます。
class Temperature {
double celsius;
public:
double getCelsius() const { return celsius; }
// 計算ゲッター - fahrenheitを保存せず、計算する
double getFahrenheit() const {
return celsius * 9.0 / 5.0 + 32.0;
}
void setCelsius(double value) { celsius = value; }
};getter で const キーワードに注目してください。これは、getter がオブジェクトを変更しないことを示します。セッターを const にすることはできません。セッターの目的はメンバー値を変更することだからです。getter とセッターを使用するこのパターンは、カプセル化の基本であり、クラスのデータへのアクセス方法と変更方法を完全に制御できます。
チャレンジ
簡単ゲッターとセッターが、バリデーションや計算プロパティを含むプライベートデータへの制御されたアクセスをどのように提供するかを示す、プレイヤープロフィールシステムを作成しましょう。
コードを整理するために、2つのファイルを作成します。
Player.h:保護されたデータアクセスによってゲームキャラクターのプロフィールを管理するPlayerclassを定義します。このclassには次の要素を含めます。- プライベートメンバー:
name(string)、level(int)、experience(int) - 名前を受け取り、
levelを1、experienceを0に初期化するConstructor - プレイヤーの名前を返すGetter
getName() - current levelを返すGetter
getLevel() - current experience pointsを返すGetter
getExperience() - 3 characters以上の名前のみを受け入れるSetter
setName()。invalidな場合は、current nameを変更しない - 正の値のみを受け入れるSetter
addExperience(int points)。experienceが100に到達するかそれをexceedsすると、プレイヤーのレベルが上がります。levelを1増やし、experienceから100を引きます。十分なexperienceが追加された場合、これは複数回happenする可能性があります。 - 次のレベルに到達するために必要なexperience pointsがあと何ポイントかを返すComputed Getter
getExperienceToNextLevel()(常に100 - current experience)
すべてのGetterには
constを付けてください。Getterはオブジェクトを変更しないためです。- プライベートメンバー:
main.cpp:GetterとSetterが実際に動作する様子を示します。inputからプレイヤー名と追加するexperience pointsを読み取ります(それぞれ別の行)。その後、次の処理を行います。- input nameを使って
PlayerをCreateする "Player: <name>, Level: <level>, XP: <experience>"を出力するaddExperience()を使ってinput experience pointsを追加する- 更新されたstateを示すため、同じstatus lineをもう一度出力する
"XP to next level: <amount>"を出力する- 名前を
"Al"にChangeしてみる(validationにfailするはずです) "Name after invalid change: <name>"を出力する- 名前を
"Champion"にChangeする(成功するはずです) "Name after valid change: <name>"を出力する
- input nameを使って
experience inputはstringとして提供され、それをintegerにconvertする必要があります。#include "Player.h"を使って、main.cppにheader fileをincludeしてください。
自分で試してみよう
#include <iostream>
#include <string>
#include "Player.h"
using namespace std;
int main() {
// プレイヤー名を読み取る
string playerName;
getline(cin, playerName);
// 追加する経験値を読み取る(文字列として、intに変換)
string expString;
getline(cin, expString);
int expToAdd = stoi(expString);
// TODO: 入力された名前でPlayerを作成する
// TODO: 初期ステータスを出力する: "Player: <name>, Level: <level>, XP: <experience>"
// TODO: addExperience()を使って入力された経験値を追加する
// TODO: 更新されたステータス行を出力する
// TODO: Print "XP to next level: <amount>"
// TODO: 名前を"Al"に変更してみる(バリデーションに失敗するはず)
// TODO: Print "Name after invalid change: <name>"
// TODO: 名前を"Champion"に変更する(成功するはず)
// TODO: Print "Name after valid change: <name>"
return 0;
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
オブジェクト指向プログラミングのすべてのレッスン
3コンストラクタとデストラクタ
デフォルトコンストラクタパラメータ付きコンストラクタコピーコンストラクタムーブコンストラクタコンストラクタ初期化リスト委譲コンストラクタデストラクタ徹底解説Rule of Three / Five / Zero復習 - Stringクラス6演算子オーバーロード
演算子オーバーロード入門算術演算子のオーバーロード比較演算子のオーバーロードストリーム演算子代入演算子のオーバーロード[] と () の演算子オーバーロード型変換演算子復習 - Matrixクラス自分で練習してみよう: C++オンラインコンパイラ