次のサンプルコードを使用して質問を説明します。クラススコープを避けて、メンバー関数を関数ポインタとして渡します。
私は次のように定義されたクラスBを持っている:
class B
{
public:
inline B(){}
inline B(int(*f)(int)) :myfunc{ f }{}
void setfunction(int (*f)(int x)) { myfunc = f; }
void print(int number) { std::cout << myfunc(number) << std::endl; }
private:
int(*myfunc)(int);
};
次のように私は、クラスAの定義:
class A
{
public:
A(int myint) :a{ myint }{ b.setfunction(g); }
int g(int) { return a; }
void print() { b.print(a); }
private:
B b;
int a;
};
を私に問題がメンバ関数gが署名を持っていることのようですint A::g(int)
int g(int)
ではなく
上記の作業を行う標準的な方法はありますか?私は、いくつかの操作を実行するメンバ関数を含むクラス(クラスB)と、クラスの特定のメンバ関数を使用する必要があるクラス(クラスA)を持っているという点で、これはかなり一般的な設定だと思いますB - 私のデザインが間違っているのでしょうか?もしそうなら、このアイデアを表現する最良の方法は何ですか?
はい、この関数 'static'を宣言。あるいは、インタフェースクラスを使用して、抽象関数 'virtual int g(int)= 0;'を定義します。このクラスから 'クラスA:公共クラス<クラス名> 'を派生させてください。次に、このクラスのインスタンスをクラス 'B'の関数に渡します。 –
C++ 11/14にタグ付けしたので、ラムダで 'std :: function'を使用することをお勧めしますか?それはあなたに少しコストがかかりますが、良い方法はありません。 – user975989
Google「メンバー関数ポインタC++」 –