2012-04-13 13 views
-1

C++では、クラスAのメソッドメンバーをクラスBからポインタを使って呼び出すにはどうすればよいですか?ところで、クラスAとクラスBは異なるタイプです。異なるクラス型のメンバー関数に変数を指す

ポインタがメンバ関数を指しているとき、クラス内のメンバ関数しか指すことができないことを読んでいます。しかし、私はどのようにクラス外のメンバ関数を指すことができますか?

例えば

:私は次のようにあなたがそれを実行することができると思い

class A 
{ 
public: 
    int add(int x) 
    { 
     return x+x; 
    } 
}; 

int main() 
{ 
    typedef int (A::*pointer)(); 
    pointer func = &A::add; 
    A objt; 
    B objt2; 

    obt2.*func(2);// the compiler give me an error of incompatible with object type ‘B’ 

    return 0; 
} 
+0

てみ '(obt2 * FUNC。)(2)' –

+5

@Chet:のインスタンスで 'A'メンバ関数を呼び出していることを解決していません'B'は無意味です。 – ildjarn

+1

このコンセプトで解決しようとしている問題は、おそらくもっと簡単に解決されています。 C++では、Smalltalkやその他の純粋なOO言語とは異なり、メソッドと関数は同じものです。継承や目的を達成するためのデザインパターンなど、言語の実用的な機能を使用するようにソリューションを並べ替えます。あなたが実際の目標を分かち合うと、誰かが有効なアプローチを示唆することができるかもしれません。 –

答えて

0

:代わりに

(*func)(&objt, 2) 

より良い選択がブースト::バインドを使用することです/ブースト::機能:

boost::function<int(int)> func = boost::bind(&A::add, &objt, _1); 
func(2); 

私はあなたがクラスBのメソッドであるかのように動作させようとしています。その後、BAを使用しています(一部のAのメンバーを呼び出します)

((A *) &objt2)->add(2); 
+0

私は自分自身をはっきりと申し訳なく思っていませんでした。私の質問は@裁判官ではありません。 私はomnetppでクラスを実装しています。このクラスは私のシミュレーションでモジュールを定義します。私はポインタを使ってメソッドにアクセスしたいです。このメソッドは、別のクラスで実装されています。このクラスは、シミュレーションで別のモジュールを定義します。 – Vilanova

+3

"おい"あなたの質問は間違っています。 –

+0

'A'と' B'が関係を持たない場合、 '(A *)&objt2'を逆参照するとUBが得られます。 – ildjarn

0

場合:10それは完全に無意味なのですが、あなたは正しさを気にして完全に予測できない結果と危険な住むのは好きではない場合、それは、これを実行する方が簡単ですBにあり、Aになります。Aのメソッドを呼び出すことができるAへのポインタをBに渡して実装することができます。下記のコードB1を参照してください。

Aのメンバーの呼び出しを別のオブジェクトファンクタにラップすることができます。テンプレートクラスとして実装し、メソッドと引数のアドレスAのオブジェクトのアドレスを提供することで、汎用ソリューションを作成できます。このためには、クラスB2の実装を参照してください。

class A 
{ 
public: 
    int add(int x) 
    { 
     return x+x; 
    } 
}; 

typedef int (A::*MEMFN)(int); 

class B1 
{ 
public: 
    void InvokeAAdd(A* pA, int x) 
    { 
     cout << "result = " << pA->add(x) << endl; 
    } 
}; 

template<class T, typename TMemFn, typename TArg, typename TRetVal> 
class B2 
{ 
    T* pT; 
    TMemFn memFn; 
    TArg arg; 
public: 
    B2(T* pT, TMemFn memFn, TArg arg) : 
     pT(pT), memFn(memFn), arg(arg){} 

    TRetVal operator()() 
    { 
     return (pT->*memFn)(arg); 
    } 
}; 

int main() 
{ 
    A a; 
    B1 b; 
    b.InvokeAAdd(&a, 2); 

    B2<A, MEMFN, int, int> b2(&a, &A::add, 2); 
    cout << "result (via functor) = " << b2() << endl; 
    return 0; 
} 

出力:

result = 4 
result (via functor) = 4 
関連する問題