Menu
Coddy logo textTech

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 とセッターを使用するこのパターンは、カプセル化の基本であり、クラスのデータへのアクセス方法と変更方法を完全に制御できます。

challenge icon

チャレンジ

簡単

ゲッターとセッターが、バリデーションや計算プロパティを含むプライベートデータへの制御されたアクセスをどのように提供するかを示す、プレイヤープロフィールシステムを作成しましょう。

コードを整理するために、2つのファイルを作成します。

  • Player.h:保護されたデータアクセスによってゲームキャラクターのプロフィールを管理するPlayer classを定義します。このclassには次の要素を含めます。
    • プライベートメンバー:name(string)、level(int)、experience(int)
    • 名前を受け取り、level1experience0に初期化する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>"を出力する

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;
}
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

オブジェクト指向プログラミングのすべてのレッスン

自分で練習してみよう: C++オンラインコンパイラ