2012-04-13 65 views
-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; 
} 
+0

尝试'(2)' – 2012-04-13 21:39:03

+5

@Chet:这并不解决调用的一个实例的'A'成员函数的事实'B'是无意义的。 – ildjarn 2012-04-13 21:39:48

+1

无论您试图用这个概念解决什么问题,都可能通过另一种方法解决起来更容易和*更好。在C++中,方法和函数与Smalltalk和其他纯粹的OO语言不同。重新整理您的解决方案,以使用语言的实用功能,例如继承或某种可实现您的目标的设计模式。如果你分享你的实际目标,有人可能会提出一些有效的方法。 – 2012-04-13 21:42:20

回答

0

我认为你可以如下运行:

(*func)(&objt, 2) 

更好的选择是使用升压::绑定/升压::功能来代替:

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

我刚刚注意到你正试图让它运行,就好像它是B类的方法一样。 这是完全荒谬的,但如果你不关心的正确性,并想与完全不可预知的结果惊险的生活,更容易做到这一点:

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

我没有解释我的自己显然对不起。我的问题不是@Chet ildjarn。 我正在omnetpp中实现一个类。这个类在我的模拟中定义了一个模块。我想用一个指针访问一个方法。该方法在另一个类中实现,该类在我的模拟中定义了另一个MOdule。 – Vilanova 2012-04-13 21:55:03

+3

“伙计”,你的问题是错误的。 – 2012-04-13 22:11:10

+0

如果'A'和'B'没有关系,则解除引用'(A *)&objt2'产生UB。 – ildjarn 2012-04-13 22:12:32

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

输出:(obt2 * FUNC)

result = 4 
result (via functor) = 4 
相关问题