Cpp クラス メンバ変数ポインタ

提供:yonewiki

C++に戻る


本来の表記は「C++(Cpp) クラス メンバ変数ポインタ」です。この記事に付けられた題名はテンプレート:記事名の制約から不正確なものとなっています。

※このページではC++にのみ存在する機能として、記事タイトルがC++ クラス メンバ変数ポインタになっています。

クラス メンバ変数ポインタ

 メンバ変数へのポインタを作る方法があることに、メンバ関数の記事を作ってから気付きました。かれこれ5年前の話です。重い腰がようやく上がった感じでしょうか?ここに初めて来た人にはどうでもいいことかもしれませんが、更新速度、おそろしく低いです。5年かかってようやっとでメンバ変数の記事を書こうと思ったのです。恐ろしや。この遅さはギネスブックいけるんじゃね?


 いけないか…


 メンバ変数をポインタでアクセスするのって、そんなに特別なことなの?意外と特別なことなのです。あまり使わない方法だからかな?ちょっとややこしい記述になってしまうからかな?メンドクサイからかな?


 まずは、メンバ変数を保持するようなクラスのヘッダファイルを作ってみます。


#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

 こんな感じでしょうか?サンプルなので、意味のないクラスになりましたね。これに意味のないメンバ変数ポインタを作ってみます。

#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;
}
#include <cstdio>
#include "CMemberPVal.h"

int main(){
    CMemberPVal objCMemberPVal(119);
    return 0;
}

 こんな感じかな。使い方はメンバ関数ポインタと同じですね。Setというメンバ関数の中で、m_iDataというメンバ変数をあえてm_piDataというポインタ変数で参照して、引数に受け取ったiArgDataを代入しています。コンストラクタの方にはメンバ関数をメンバ関数ポインタでSetという関数を参照して、コンストラクタ引数を設定するように呼び出しています。

109行目~111行目(CMmberPVal.cppプログラムファイル部)

int (CMember::*m_piData);
m_piData = &CMemberPVal::m_iData;
(this->*m_piData) = iArgData;

 上記部分がメンバ変数ポインタを使っているところです。


 もっと有意義な使い方についての説明はまた今度ですね。この先で説明するテンプレートという技術とかを使って、ポインタ型として扱って汎用性を持たせるといったことができます。


C++に戻る