2017年10月17日
《その82》 constメンバ関数,mutable指定子
constメンバ関数 と mutable指定子
次のような、日本史の勉強に使うためのクラス J_history があるものとします。
class J_history {
std::string event_; // 出来事
std::string memo_; // メモ
int year_; // 西暦
int counter; // カウンター(このクラスオブジェクトの利用回数)
public:
J_history(std::string e, std::string m, int y) {
event_ = e; memo_ = m; year_ = y; counter = 0;
}
std::string event() { counter++; return event_; }
std::string memo() { counter++; return memo_; }
int year() { counter++; return year_; }
};
J_history型の sekigaharaクラスを、const を付けて作成しました。
const J_history sekigahara(
"関ヶ原の戦い",
"徳川家康の東軍と石田三成の西軍が戦った。東軍が勝利。",
1600
);
ところが、sekigaharaクラスのメモを見ようとして、
cout << sekigahara.memo();とするとエラーになってしまいます。
この不具合は、メンバ関数に const を付けて constメンバ関数にすることで解決します。
class J_history {
std::string event_;
std::string memo_;
int year_;
mutable int counter;
// ↑ mutable の説明は、※2.を見てください。
public:
J_history(std::string e, std::string m, int y) {
event_ = e; memo_ = m; year_ = y; counter = 0;
}
std::string event() const { counter++; return event_; }
std::string memo() const { counter++; return memo_; }
int year() const { counter++; return year_; }
};
※1. constオブジェクトのメンバ関数で、呼び出される可能性があるものには、
const を付けて constメンバ関数にしておく。
※2. constメンバ関数は、原則としてデータメンバの値を変更できないが、
mutable指定子を付けて宣言されたデータメンバだけはその値を変更できる。
counterは sekigaharaクラスの利用回数を記録するデータメンバなので、値の変更ができないと困ります。
#include <string>
#include <iostream>
class J_history {
std::string event_; // 出来事
std::string memo_; // メモ
int year_; // 西暦
mutable int counter; // カウンター
public:
J_history(std::string e, std::string m, int y) {
event_ = e; memo_ = m; year_ = y; counter = 0;
}
std::string event() const { counter++; return event_; }
std::string memo() const { counter++; return memo_; }
int year() const { counter++; return year_; }
};
int main() {
const J_history sekigahara(
"関ヶ原の戦い",
"徳川家康の東軍と石田三成の西軍が戦った。東軍が勝利。",
1600
);
std::cout << sekigahara.event() << '\n';
std::cout << sekigahara.memo() << '\n';
}
--
この記事へのコメント
コメントを書く
この記事へのトラックバックURL
https://fanblogs.jp/tb/6865765
※ブログオーナーが承認したトラックバックのみ表示されます。
この記事へのトラックバック