Cpp クラス アクセス指定子 新しいページはコチラ

提供: yonewiki
移動: 案内, 検索
(クラス アクセス指定子)
(クラス アクセス指定子)
152行: 152行:
 
}
 
}
 
</syntaxhighlight>
 
</syntaxhighlight>
と上記のように利用します。_tmain関数からの呼び出し処理がいわゆる外部からの呼び出しにあたる処理になります。
+
と上記のように利用します。_tmain関数からの呼び出し処理がいわゆる外部からの呼び出しにあたる処理になります。クラスを説明した記事でも記述しましたが、Access_Specifiers001.hファイルの★1.部分にあるようなm_nValueというint型の変数には_tmain関数から呼び出すことはできないため、CAccess_Specifiers001_Instance->m_nValueのように変数の呼び出しをしようとするとコンパイルエラーになります。値を設定するにはSet_m_nValue関数を値を取得するにはGet_m_nValue関数を使うしかないのがCAccess_Specifiers001の取り決めになります。
 +
 
 +
 
 +
これは何のために、こんなまどろっこしいことになっているのでしょうか?今のところのプログラムでは直接、m_nValueの値を設定できた方が良さそうに感じます。実はこのクラスはm_nValueには-999~999の値を最初に設定してほしいという規制を作りたいとします。そうするとSet関数内でその新たに規制のための処理を追加すれば良くて、直接に変数を呼び出して値を設定をすることはできないということが、クラスという機能を使う考え方になっています。そのためにアクセス指定子によって、直接に変数を呼び出すことを制御できることになります。このような仕組みを隠蔽と呼んでいます。英語だと確かインヘリタンスとかって呼ばれています。
 +
 
 +
 
 +
クラスのメンバ関数もメンバ変数と同じで、呼び出されるとまずい関数を作りたくなったりする場合が生じてきます。では、実際にサンプルプログラムのAccess_Specifiers001.cppの内容を書き換えて、設定値に関する規制を作ろうと思います。以下のようになります。
 +
 
 +
Access_Specifiers001.cpp
 +
<syntaxhighlight lang="cpp" line start="1">
 +
 +
省略
 +
 +
void CAccess_Specifiers001::Set_m_nValue(int nSetValueP){
 +
  if(m_nValue <= -1000 && m_nValue >=1000){
 +
    printf("Warning:Set_m_nValue関数で認められない値が設定されました。(Limit -999~999)\n");
 +
  }
 +
  else{
 +
    m_nValue = nSetValueP;
 +
  }
 +
}
 +
 +
省略
 +
 +
</syntaxhighlight>
 +
ちょっと冷たいエラーメッセージですが、とりあえず規制されました。Windowsとかのダイアログでの入力だと入れようとするとOKボタンが押せないとか、そういう感じの冷たさのエラーがでるのと同じです。親切ならOKボタンを押したときに、エラー値が入れられた値の欄を明示して、どの値がダメとか丁寧なエラーを出したり、入力したとたんエラーをしめすような、入力欄の名前の部分や、値そのものが赤色の文字になって不正であることを示したりします。ここでは、当初の目標であるアクセス指定子を出来るだけ丁寧に説明するというだけのサンプルであるという雑さをもちあわせたまま、無理やりにサンプルを作ります。
 +
 
 +
 
 +
ク、クラス恐るべしだな。ひとつの機能の塊をもつのがクラスだから、こんな指定があるので、覚えるしかないですが、最初にこの技術をしったとき、こういった説明を読んでも尚、まだ納得してませんでした。ややこしい仕組みだなぁ。こんなのつかわなくてもプログラムなんてやれると反抗的な態度だった若かりし頃の自分を思い出します。最近の若い人はどんな風に感じるんだろうか。ICT社会だから、すぐ納得できるんだろうか。心配です。
 +
 
 +
 
 +
とにもかくにもクラスの中で定義されてるメンバ関数から呼び出すのが内部(Access_Specifiers001.cpp内で記述している関数)で、それ以外は外部(上の例なら_tmain関数)ってことです。それが内部と外部です。わかっていただけていたら幸せなことです。
 +
 
 +
 
 +
じゃ、あとはprotectedで説明した派生したクラスと内部だけっていうパターンを説明する感じですね。これは別の項目でも継承って奴について記述するつもりなので詳細は継承の記事を読んでもらえるといいんですけど、まずは簡単に派生ってやつのパターンを示したいと思います。でも、今日はここまでかな。

2015年4月25日 (土) 00:00時点における版



個人用ツール
名前空間

変種
操作
案内
ツールボックス