Cpp クラス メンバ変数ポインタ 新しいページはコチラ
提供: yonewiki
(ページの作成:「C++に戻る <table class="mbox-small" style="border:1px solid #aaa; background-color:#f9f9f9; width:22em;" id="RealTitleBanner"> <tr>...」) |
|||
5行: | 5行: | ||
<tr> | <tr> | ||
<td style="width:1px;"></td> | <td style="width:1px;"></td> | ||
− | <td class="mbox-text plainlist" style="">本来の表記は「<b><span id="RealTitle" style="font-size:large;">C++ クラス | + | <td class="mbox-text plainlist" style="">本来の表記は「<b><span id="RealTitle" style="font-size:large;">C++(Cpp) クラス メンバ変数ポインタ</span></b>」です。この記事に付けられた題名は{{記事名の制約}}から不正確なものとなっています。</td> |
</tr> | </tr> | ||
</table> | </table> | ||
− | ※このページでは[[C PlusPlus|C++]]にのみ存在する機能として、記事タイトルが<nowiki>C++ クラス | + | ※このページでは[[C PlusPlus|C++]]にのみ存在する機能として、記事タイトルが<nowiki>C++ クラス メンバ変数ポインタ</nowiki>になっています。<br /> |
<br /> | <br /> | ||
− | == '''クラス | + | == '''クラス メンバ変数ポインタ''' == |
+ | メンバ変数へのポインタを作る方法があることに、メンバ関数の記事を作ってから気付きました。かれこれ5年前の話です。重い腰がようやく上がった感じでしょうか?ここに初めて来た人にはどうでもいいことかもしれませんが、更新速度、おそろしく低いです。5年かかってようやっとでメンバ変数の記事を書こうと思ったのです。恐ろしや。この遅さはギネスブックいけるんじゃね? | ||
+ | |||
+ | |||
+ | いけないか… | ||
+ | |||
+ | |||
+ | メンバ変数をポインタでアクセスするのって、そんなに特別なことなの?意外と特別なことなのです。あまり使わない方法だからかな?ちょっとややこしい記述になってしまうからかな?メンドクサイからかな? | ||
+ | |||
+ | |||
+ | |||
+ | まずは、メンバ変数を保持するようなクラスのヘッダファイルを作ってみます。 | ||
+ | |||
+ | |||
+ | <syntaxhighlight2 lang="cpp" line> | ||
+ | #ifndef __MEMBERPVAL_H_YONET__ | ||
+ | #define __MEMBERPVAL_H_YONET__ | ||
+ | |||
+ | #if _MSC_VER > 1000 | ||
+ | #pragma once | ||
+ | #endif | ||
+ | |||
+ | class CMemberPVal{ | ||
+ | private: | ||
+ | int m_iData; | ||
+ | public: | ||
+ | CMemberPVal(int iArgData); | ||
+ | int Get_Data(); | ||
+ | void Set_Data(int iArgData); | ||
+ | }; | ||
+ | #endif | ||
+ | </syntaxhighlight2> | ||
+ | |||
+ | こんな感じでしょうか?サンプルなので、意味のないクラスになりましたね。これに意味のないメンバ変数ポインタを作ってみます。 | ||
+ | |||
+ | <syntaxhighlight2 lang="cpp" line start=100> | ||
+ | #include <cstdio> | ||
+ | #include "CMemberPVal.h" | ||
+ | |||
+ | CMemberPVal::CMemberPVal(int iArgData){ | ||
+ | void (CMemberPVal::*pfuncSet)(int); | ||
+ | pfuncSet = &CMemberPVal::SetData; | ||
+ | (this->*pfuncSet)(iArgData); | ||
+ | } | ||
+ | void CMemberPVal::Set(int iArgData){ | ||
+ | int (CMemberPVal::*m_piData); | ||
+ | m_piData = &CMemberPVal::m_iData; | ||
+ | (this->*m_piData) = iArgData; | ||
+ | } | ||
+ | int CMemberPVal::Get(){ | ||
+ | return m_iData; | ||
+ | } | ||
+ | </syntaxhighlight2> | ||
+ | |||
+ | <syntaxhighlight2 lang="cpp" line start=200> | ||
+ | #include <cstdio> | ||
+ | #include "CMemberPVal.h" | ||
+ | |||
+ | int main(){ | ||
+ | CMemberPVal objCMemberPVal(119); | ||
+ | return 0; | ||
+ | } | ||
+ | </syntaxhighlight2> | ||
+ | |||
+ | こんな感じかな。使い方はメンバ関数ポインタと同じですね。Setというメンバ関数の中で、m_iDataというメンバ変数をあえてm_piDataというポインタ変数で参照して、引数に受け取ったiArgDataを代入しています。コンストラクタの方にはメンバ関数をメンバ関数ポインタでSetという関数を参照して、コンストラクタ引数を設定するように呼び出しています。 | ||
+ | |||
+ | == '''109行目~111行目(CMmberPVal.cppプログラムファイル部)'''== | ||
+ | <syntaxhighlight2 lang="cpp"> | ||
+ | int (CMember::*m_piData); | ||
+ | m_piData = &CMemberPVal::m_iData; | ||
+ | (this->*m_piData) = iArgData; | ||
+ | </syntaxhighlight2> | ||
+ | 上記部分がメンバ変数ポインタを使っているところです。 | ||
+ | |||
+ | |||
+ | もっと有意義な使い方についての説明はまた今度ですね。この先で説明するテンプレートという技術とかを使って、ポインタ型として扱って汎用性を持たせるといったことができます。 | ||
[[C PlusPlus#C++からの技術|C++]]に戻る | [[C PlusPlus#C++からの技術|C++]]に戻る |