「アクセス制御」の編集履歴(バックアップ)一覧に戻る
アクセス制御 - (2017/05/20 (土) 16:27:26) のソース
*アクセス制御 **アクセス修飾子 オブジェクトのメンバはアクセス制限をする事ができます。 |public | どこからでもアクセス可能| |private | そのクラス内からのみアクセス可能| |protected | そのクラスとその派生クラスからアクセス可能(後の章で説明)| メンバ変数をprivateにすると外部からの直接的な参照と変更ができなくなります。 これにより変更されたくない変数を隠したり、値を安全に処理させることが可能です。 ・値の代入に関数を使い、不正な値が代入されないようにチェックする。 ・値の変更に伴い、関連する処理を実行させる。 ・メンバ変数を隠し、クラスの内部処理専用変数として使う。 ***アクセス制限の例 /*--------------Character.hの中身----------------*/ #include < iostream > using namespace std; // キャラクタークラス class Character{ private: //【メンバ変数】 string name; // 名前 int HP; // 体力 int STR; // 攻撃力 public: //【メンバ関数】 Character(string name, int HP, int STR); // コンストラクタ ~Character(); // デストラクタ void Damage(int damage); // ダメージ関数 }; /*--------------Character.cppの中身----------------*/ #include "Character.h" // コンストラクタ Character::Character(string name, int HP, int STR){ this->name = name; this->HP = HP; this->STR = STR; } // デストラクタ Character::~Character(){ // 何もしない } // ダメージ関数 void Character::Damage(int damage){ this->HP -= damage; } 基本的には、&bold(){変数はprivate} &bold(){関数はpublic}に指定します。 //**カプセル化 //クラスを利用する側にとって必要のないメンバは隠すべきです。 //これをカプセル化と言います。 //オブジェクト指向の考え方は、オブジェクト同士のメッセージのやりとりである //というものがあります。 //メンバ変数を直接読み書きすることはこれに反します。 //オブジェクトは外部のメッセージを受けて動作するものです。 //つまりメンバ変数は隠し //外部からできる動作のみ公開するべきです。 **メンバ変数の読み書き 変数は基本的にprivateであるべきです。 しかし、privateなメンバには外部から参照できません。 /*--------------main.cppの中身----------------*/ #include "Character.h" int main(){ // Characterクラスの実体「karasawa」を作成 Character* karasawa = new Character("唐沢", 10, 2); karasawa->Damage(5); // 唐沢に5ダメージ // 唐沢のHPを表示 cout << "HP:" << karasawa->HP << endl; //【エラー:karasawa->HPを参照できない】 return 0; } 以上のことからメンバ変数の読み書きには以下のような手順で行います。 private なメンバ変数を public なメンバ関数で読み書きする。 これをアクセッサといい、 メンバ変数を取得する関数をゲッター メンバ変数に書き込む関数をセッター といいます。 getは戻り値で値を返し setは引数で値を取得し、メンバ変数に割り当てます。 ***Hoge.h #html2(){{ <pre class="brush: cpp;"> #pragma once class Hoge { private: int num; public: Hoge(void); void setNum(int num); //numのセッター int getNum(); //numのゲッター }; </pre> }} ***Hoge.cpp #html2(){{ <pre class="brush: cpp;"> #include "Hoge.h" Hoge::Hoge(void) { } void Hoge::setNum(int num){ this->num = num; } int Hoge::getNum(){ return this->num; } </pre> }} ***main.cpp #html2(){{ <pre class="brush: cpp;"> #include "Hoge.h" #include < iostream > using namespace std; int main(){ Hoge *hoge = new Hoge(); // hoge->num = 10; //このような書き方はコンパイルエラー //セッターを通して値をセット hoge->setNum( 10 ); //ゲッターを通して値を取得 cout << hoge->getNum() << endl; return 0; } </pre> }} **コンストラクタの隠蔽 コンストラクタをprivateにすることにより 直接オブジェクトを作らせない ということができます。 使い道については後の章、「静的メンバ」と「デザインパターン」で学習する予定です。 //#include(highlight) *問題 **問題1 以前作成した Bottle クラスのアクセスを理解せよ。 また、新たに getVolume() 関数を追加し、現在の容量をmain側で表示するようにせよ。 **問題2 以前作成した Person クラスのメンバ変数を全て private にし 必要に応じてコンストラクタとアクセッサを実装せよ。 testcounter 合計 &counter(total) 今日 &counter(today) 昨日 &counter(yesterday)