あるクラスのメンバ関数を、そのクラスのメンバ変数で保持したい

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
3T

あるクラスのメンバ関数を、そのクラスのメンバ変数で保持したい

#1

投稿記事 by 3T » 15年前

お世話になります。
また質問させてください。

http://www.geocities.jp/ky_webid/cpp/language/034.html
このサイトを参考に、メンバ関数をメンバポインタ変数で保持・実行をしたいのですが、上手くいきません。
どのように改善したらいいのでしょうか。
#include <iostream>

class CSample
{
public:
    void    (CSample::*p)();

    void    func()
    {
        printf("func\n");
    }
};

int main()
{
    CSample    obj;
    obj.p        =    &CSample::func;
    (obj.*p)();// error C2065: 'p' : 定義されていない識別子です。

    return 0;
}
上のソースですと、コメント部分にエラーが発生してしまいます。
これをどうにか出来ないか、という相談です。

よろしくお願いします。

たかぎ

Re:あるクラスのメンバ関数を、そのクラスのメンバ変数で保持したい

#2

投稿記事 by たかぎ » 15年前

これではダメです。
設計の善し悪しは別として...
(obj.*obj.p)();
とする必要があります。

3T

Re:あるクラスのメンバ関数を、そのクラスのメンバ変数で保持したい

#3

投稿記事 by 3T » 15年前

うええ……もう訳が分からない状態です;
確かに、そうすると動作しますが……何でそういう記述になるのかとかが分かりません;;
勉強不足ですね。

また、設計の善し悪しは~ということからして、別の方法を取った方が良いということですかね。
色々勉強してみます。。。

ありがとうございます。

sizuma

Re:あるクラスのメンバ関数を、そのクラスのメンバ変数で保持したい

#4

投稿記事 by sizuma » 15年前

>メンバ関数ポインタ pFunc を定義したとき、どのインスタンスのものかを指定しないため、「pFunc()」と書くだけでは、どのインスタンスのメンバ関数を呼び出すのか分かりません。そのため、インスタンス名と上記の2つの演算子のいずれかを使ってアクセスすることになります。

参考にされてるサイトにこう書いてありますね。
つまり、
「*obj.pだけだと、ここにCSampleのfunc関数ポインタがあるのはわかるんだけど、どのインスタンスのポインタなのかが分からない。objかな?obj2かな(生成すれば)?」
ということなのでしょう。

staticメソッドだとクラス固有だから指定はいりません。
Javaだと確か指定しても指定しなくてもアクセス出来た気が・・・・(staticメソッドに)
オーバーライドされてなきゃ(virtualついてなきゃ)問題ない気もしますけどねー

例えば普通にmainから関数ポインタ呼び出すことを考えてみると、インスタンスを生成してないのにメンバ関数を呼び出しちゃいけないですよね?
クラスはただの鋳型で、実体(インスタンス)はそれぞれ別の物だから、指定するのが当然なわけです。



と、分かってる風に書いてるけど、C++入門者です
間違ってたらたかぎさんが訂正してくれるはず^^;
画像

3T

Re:あるクラスのメンバ関数を、そのクラスのメンバ変数で保持したい

#5

投稿記事 by 3T » 15年前

なるほど、そういうことは考えられますね……。
それで、こんな変な(といったら失礼ですが)書き方してるわけですね。

ありがとうございます。

sizuma

Re:あるクラスのメンバ関数を、そのクラスのメンバ変数で保持したい

#6

投稿記事 by sizuma » 15年前

>それで、こんな変な(といったら失礼ですが)書き方してるわけですね。
ごく自然な表現だと思いますよ?
まぁ感じ方は人それぞれでしょうけど・・・

>メンバ関数をメンバポインタ変数で保持・実行をしたい
なにを実装したいのか分からないので、はっきりとはいえませんが。
とりあえず、変数はprivateにして、メソッドからアクセスさせたほうがいいと思います。
そうすれば、obj.*obj.pみたいな表現はなくなりますから。
せっかくオブジェクト指向の機能があるので、基本的に変数は隠蔽ですね。

閉鎖

“C言語何でも質問掲示板” へ戻る