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