Skip to content
On this page

Capsulated Zer0-Star

6.1. 構造体に登場したMemberクラスについて、trap_idstudent_idgradeを隠蔽しよう。また、trap_idstudent_idは読み取りのみ、gradeは読み取りと変更ができるようにしよう。

cpp
struct Member {
  string trap_id, student_id;
  int grade;
};
Answer

値の設定をするメンバ関数と取得をするメンバ関数(それぞれ、setter,getterと呼ばれます)を用意すると、隠蔽されたメンバ変数へアクセスすることができる。

cpp
// setter, getterを用いた実装
#include <iostream>
#include <string>

using namespace std;

class CapsulatedMember {
    private:
    string trap_id, student_id;
    int grade;

    public:
    CapsulatedMember(
        string trap_id_,
        string student_id_,
        int grade_
    ) {
        trap_id = trap_id_;
        student_id_ = student_id_;
        grade = grade_;
    }

    void set_grade(int new_grade) {
        grade = new_grade;
    }

    string get_trap_id() {
        return trap_id;
    }

    string get_student_id() {
        return student_id;
    }

    int get_grade() {
        return grade;
    }
};

メンバ変数の参照を返すメンバ関数でも良い。

cpp
// 参照渡しを用いた実装
#include <iostream>
#include <string>

using namespace std;

class CapsulatedMember {
    private:
    string _trap_id, _student_id;
    int _grade;

    public:
    CapsulatedMember(
        string trap_id_,
        string student_id_,
        int grade_
    ) {
        _trap_id = trap_id_;
        _student_id_ = student_id_;
        _grade = grade_;
    }

    const string& trap_id() {
        return _trap_id;
    }

    const string student_id() {
        return _student_id;
    }

    int& grade() {
        return _grade;
    }
}