メモの日々


2009年06月03日(水) [長年日記]

  • 単調な毎日。

[c++] C++でのクラスのメンバへのポインタ

クラスのメンバへのポインタを使った。すぐに忘れそうなのでメモ。

  • 例えば、クラスAのstring型のメンバ変数へのポインタを格納する変数sは「string A::* s」のように宣言する。
  • クラスAのstring型のメンバ変数sssへのポインタは、「&A::sss」のように書けば取得できる。故に「string A::* s = &A::sss」と代入できる。
  • 同様にしてメンバ関数へのポインタも扱える。「int (A::*f)(const string&) = &A::func」みたいな。
  • ポインタを使うときには対応するクラスのインスタンスが必要になる。クラスAのインスタンスaがあったとき、「a.*s」や「(a.*f)("aaa")」のように使う。

以下サンプルプログラムと実行結果。

#include <iostream>
#include <string>
#include <vector>

struct A {
    int i1;
    int i2;
    int plus1(int i) { return i + 1; }
    int minus1(int i) { return i - 1; }
};

// クラスAのインスタンスinstanceの、
// int型のメンバ変数memberに、
// 整数valueを設定する。
void set_integer_to_A(A& instance, int A::* member, int value) {
    instance.*member = value;
}

// クラスAのインスタンスinstanceの、
// int型の引数を取りint型の値を返すメンバ関数fに、
// 整数iを渡した戻り値を返す。
int call_func_of_A(A& instance, int (A::*f)(int), int i) {
    return (instance.*f)(i);
}

int main() {
    A a;
    set_integer_to_A(a, &A::i1, 100);
    set_integer_to_A(a, &A::i2, 200);
    std::cout << a.i1 << "\n"
              << a.i2 << "\n"
              << call_func_of_A(a, &A::plus1, 10) << "\n"
              << call_func_of_A(a, &A::minus1, 10) << "\n";
}
100
200
11
9

やること

  • 請求書
  • 請書