2013年8月7日水曜日

C++メンバ関数の良いところ

今回はメンバ関数と使うと何が便利になるのかを説明します。^^

メンバ関数を使う最大のメリットとは、メンバ変数へのアクセスを制限できることなのです。 
次の例を見てください。

桃の桐箱クラス
class PeachBox {
public:
    void Add(int addpeach);
    void Del(int delpeach);
    void Empty();
    int GetTotal();
private:
    int m_total;
}; 

PeachBoxクラスでは、メンバ変数 m_total がprivateなので、直接値を設定することができません。
値を設定するためには、メンバ関数を使うようにします。

  :
int main(void)
{
    PeachBox myPeachBox;
    
    myPeachBox.m_total = 5;    //これはコンパイルエラーになります(^_^;)
        :

C言語の構造体には、アクセス制限の仕組みはありませんでした。
そのため意図しない箇所で、うっかりメンバ変数に直接アクセスしてもエラーにはなりません。
つまり予定外に値が変更されるのを完全に防ぐことはできないのです。

アクセス制限があれば、安全なプログラムを作成することができます。^^


また、メンバ関数での値チェックができます。
メンバ関数でメンバ変数の値を設定することで、設定値が正しいかどうかをチェックできます。
チェック機能を追加した例を見てください。

void PeachBox::Add(int addpeach)
{
    m_total += addpeach;

    if (m_total > 18) {        //18個を超えるときは、18個に設定する
        m_total = 18;          //桐箱は18個入りと決めた^^
    }

    return;
}

メンバ関数にチェック機能を付けておくことで、無効なデータをガードし、
また一歩安全なプログラムに近づきます。


また、メンバ変数の設定処理が1つだけなので、将来の修正も容易になります。
例えば、PeachBoxクラスでの管理が桃の数ではなく、重量に変更になったとします。

もし直接値を入力している場合は、修正するのも大変です(^_^;)
数が少なければいいかもしれませんが、何箇所にもわたって設定箇所があった場合は、
どうしても漏れや間違いが生じるものです。
仮に修正し忘れがあったとしても、コンパイルエラーにはなりませんので間違いには
気づかないままになってしまうでしょう。

そんなことを考えながら一つ一つ直していくのは、頭の痛い作業です。
そしてまた、余計なミスにも繋がります。

個数管理から重量管理への変更1    大変だ(-_-;)
    :                                                            :
PeachBox myPeachBox;          PeachBox myPeachBox;
myPeachBox.m_total = 6;          myPeachBox.m_total = 180;
    :                                                            :
myPeachBox.m_total = 12;    ⇒    myPeachBox.m_total = 200;
    :                                                            :
myPeachBox.m_total = 18;                    myPeachBox.m_total = 190;
   :                                                            :


これが、メンバ関数を使用している場合は、修正箇所も少なく簡単です。

個数管理から重量管理への変更2    お手軽だ(^^)v
void PeachBox::Add(int addpeach)        void PeachBox::Add(int addpeach)
{                                                {
    m_total += addpeach:                               m_total += addpeach * 150;  //1個150g換算
}                                                            }

void PeachBox::Del(int delpeach)     ⇒     void PeachBox::Del(int delpeach)
{                                                            {
    m_total -= delpeach;                                m_total -= delpeach * 150;  //1個150g換算
}                                                            } 



このようにメンバ関数をうまく使えば、仕様変更にも間単に対応できますね^^
 



今日の名言
「不可能」と言う文字は、愚か者の辞書にしか存在しない。
                                          ナポレオン

恐ろしくてできそうもないことを成し遂げれば、恐怖は必ず消滅する。
                                          ラルフ・ワルド・エマーソン

この世を動かす力は希望である。やがて成長して新しい種が得られると言う希望がなければ、
農民は畑に種をまかない。子どもが生まれると言う希望がなければ、若者は結婚できない。
利益が得られると言う希望がなければ、商人は商売に取り掛からない。
                                          マルティン・ルター