将变量指向来自不同类类型的成员函数

时间:2012-04-13 21:35:24

标签: c++ class pointers

在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;
}

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分:0)

如果B使用A(调用某些A的成员),那么B 取决于A上的,您就可以通过简单地向B提供指向A的指针来实现此功能,通过该指针可以调用A的方法 - 请参阅下面的代码中的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