2012-04-13 98 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 
相關問題