Cpp クラス オーバーロードのソースを表示
新しいページはコチラ
移動:
案内
,
検索
[[C PlusPlus#C++からの技術|C++]]に戻る <table class="mbox-small" style="border:1px solid #aaa; background-color:#f9f9f9; width:22em;" id="RealTitleBanner"> <tr> <td style="width:1px;"></td> <td class="mbox-text plainlist" style="">本来の表記は「<b><span id="RealTitle" style="font-size:large;">C++ クラス オーバーロード</span></b>」です。この記事に付けられた題名は{{記事名の制約}}から不正確なものとなっています。</td> </tr> </table> ※このページでは[[C PlusPlus|C++]]にのみ存在する機能として、記事タイトルが<nowiki>C++ クラス オーバーロード</nowiki>になっています。<br /> <br /> == '''クラス オーバーロード''' == 同じメンバ関数名に対して引数の異なるモノを作成することをオーバーロードするとか、多重定義をすると言います。受け取った引数によって処理を変えたり、少しだけ引数を加工して、結局は共通のプログラムを動かすための架け橋にしたりすることが出来ます。いろいろな引数で対応して便利な機能を提供することが出来ます。これはコンストラクタに対しても行えるモノです。 例えば、以下のようになります。 <span style="color: #ffffff; background-color: #555555; padding: 0px 5px 0px 5px; display: inline-block;">cpp <span>(</span>COverloadSum.h<span>)</span></span><!-- padding 上 右 下 左--> <syntaxhighlight2 lang="cpp" line> #ifndef __COVERLOADSUM_H_YONET__ #define __COVERLOADSUM_H_YONET__ #if _msc_ver_ >1000 #pragma once #endif class COverloadSum{ private: int m_iSum; int* m_piData; void m_fSum(int* iArgVal); public: void COverloadSum(int iArgVal1, int iArgVal2); void COverloadSum(int* piArgVal); void COverloadSum(float fArgVal1, fArgVal2); void COverloadSum(float* pfArgVal); int Get(); }; #endif </syntaxhighlight2> <span style="color: #ffffff; background-color: #555555; padding: 0px 5px 0px 5px; display: inline-block;">cpp <span>(</span>COverloadSum.cpp<span>)</span></span><!-- padding 上 右 下 左--> <syntaxhighlight2 lang="cpp" line start=100> #include <cstdio> #include "COverloadSum.h" using namespace std; void COverloadSum::COverloadSum(int iArgVal1, int iArgVal2){ m_piData = new int[2]; m_piData[0] = iArgVal1; m_piData[1] = iArgVal2; m_fSum( m_piData, 2); } void COverloadSum::COverloadSum(int* piArgVal, int iSizeArgVal){ m_fSum( m_piArgVal, iSizeArgVal); } void COverloadSum::COverloadSum(float fArgVal1, float fArgVal2){ m_piData = new int[2]; m_piData[0] = ceil(fArgVal1); m_piData[1] = ceil(fArgVal2); m_fSum( m_piData, 2); } void COverloadSum::COverloadSum(float* pfArgVal, int iSizeArgVal){ for(int iScan = 0; i < iSizeArgVal / sizeof (float) ; iScan++){ m_piData[iScan] = pfArgVal[iScan]; } m_fSum( m_piData, iScan); } void mf_Sum(int* piArgVal, int iSizeArgVal){ for(int iScan = 0; i < iSizeArgVal / sizeof(int) ; iScan++){ m_iSum = m_iSum + piArgVal[iScan]; } } int Get(){ return m_iSum; } </syntaxhighlight2> <span style="color: #ffffff; background-color: #555555; padding: 0px 5px 0px 5px; display: inline-block;">cpp <span>(</span>OverloadSumMain.cpp<span>)</span></span><!-- padding 上 右 下 左--> <syntaxhighlight2 lang="cpp" line start=200> #include <cstdio> #include "COverloadSum.h" using namespace std; int main(){ COverloadSum objCOverloadSum_Int_Int(5, 5); COverloadSum objCOverloadSum_Float_Float(13.3, 7.25); int piDataArr[4] = { 3, 7, 9, 10 }; COverloadSum objCOverloadSum_pInt(piDataArr, sizeof(piDataArr)); float pfDataArr[5] = { 3.2, 5.4, 8.2, 13.4, 42.5 }; COverloadSum objCOverloadSum_pFloat(pfDataArr, sizeof(pfDataArr)); printf("IntInt=%d, pInt=%d, FloatFloat=%d, pFloat=%d,\n", objCOverloadSum_Int_Int.Get(), objCOverloadSum_pInt.Get(), objCOverloadSum_Float_Float.Get(), objCOverloadSum_pFloat.Get() ) } </syntaxhighlight2> === '''8行目~11行目(ヘッダファイル部)''' === <syntaxhighlight2 lang="cpp"> void COverloadSum(int iArgVal1, int iArgVal2); void COverloadSum(int* piArgVal); void COverloadSum(float fArgVal1, fArgVal2); void COverloadSum(float* pfArgVal); </syntaxhighlight2> ここが、多重定義(Overload:オーバーロード)部分で、同じ名前のメンバ関数がズラッと書かれていますが、それぞれ異なる型の引数を受け取るように定義されています。これでも対応している引数の取り方は少ない方です。もっともっといろんな引数を受け渡したいパターンもあると思います。もっともっと汎用性を持たせるためには、後で紹介する予定のSTL(スタンダードテンプレートライブラリ)という技術を使う方法もあります。一個人が作るコードが、そこまで汎用性をもったクラスである必要は低いかもしれませんが、理解しておかなければ、いざという時につぶしが効かないということを心にして、こういったプログラミングの学習は進めて行くべきだと思います。 === '''102行目~131行目(クラスプログラム部)''' === そうして、具体的な処理内容を記述します。ここではint型の2つの引数を受け取る関数はint型の配列関数にしてint型の配列を全て足し合わせる関数を読んでいます。m_fSum関数はすべてのオーバーロード関数から呼び出されるプライベートなクラスです。int型配列を受け取る関数はそのままm_fSumへ受け流す感じになり、float型はint型に変換+小数点以下の切り上げという方法を実施して足しています。float型配列を受け取る関数はそれぞれをint型に変換しつつ、受け渡すためのint配列を構成します。 このように異なる引数を受け取った関数がよりよい機能であるためにオーバーロードを行います。よくみかけるものです。可変長の引数を受け取る関数もこの仕組みを使えば作成可能です。 まぁでも疲れる。まじで疲れる。このサンプルプログラムも疲れる。そういうことです。あんまり使いたくないなぁ。最低限の技術しか使おうとしない自分のような、さぼりプログラマには敷居が少し高いな。飲食店の入り口がマンションのドアみたいになっている店くらい敷居が高い。 [[C PlusPlus#C++からの技術|C++]]に戻る
テンプレート:記事名の制約
(
ソースを閲覧
)
Cpp クラス オーバーロード
に戻る。
個人用ツール
ログイン
名前空間
ページ
議論
変種
表示
閲覧
ソースを表示
履歴表示
操作
検索
案内
メインページ
コミュニティ・ポータル
最近の出来事
最近の更新
おまかせ表示
ヘルプ
ツールボックス
リンク元
関連ページの更新状況
特別ページ