-1

C++ では、ポインターを使用して、クラス B からクラス A のメソッド メンバーを呼び出すにはどうすればよいですか? ちなみにクラス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;
}
4

2 に答える 2

0

if Buses A(calls someAのメンバー) にB 依存し、 のメソッドを呼び出すことができるポインターをA提供するだけでこれを実装できます。コードの下のクラスを参照してください。BAAB1

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
于 2012-04-13T22:15:32.163 に答える
0

次のように実行できると思います。

(*func)(&objt, 2)

代わりに boost::bind/boost::function を使用することをお勧めします。

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

クラス B のメソッドであるかのように実行しようとしていることに気付きました。まったく無意味ですが、正確さを気にせず、完全に予測不可能な結果で危険な生活をしたい場合は、これを実行する方が簡単です。 :

((A *) &objt2)->add(2);
于 2012-04-13T21:49:13.633 に答える