2011-09-07 49 views
1

綁定和非綁定代表有什麼區別?CLI/C++中綁定和非綁定代理之間的區別

繼承人如何創建兩種類型的代表:

// bound delegate declaration 
public delegate void Handler(int value); 
// create a bound delegate 
Handler^ handler = gcnew Handler(HandlerClass::Fun1); 

// unbound delegate declaration 
public delegate void UBHandler(ThisClass^, int value); 
// create an unbound delegate 
UBHandler^ ubh = gcnew UBHandler(&ThisClass::Sum); 

這些都是幾乎相同。然後,您可以爲包括兩個參數界代表創建的構造函數:

HandlerClass^ obj = gcnew HandlerClass; 
Handler^ handler2 = gcnew Handler (obj, & HandlerClass::Fun3); 

這意味着你可以使用這個特殊的委託來調用一個函數,不是靜態的(是一個實例)。但是你可以對未綁定的代理做同樣的事情。這裏是你會如何調用UBH委託:

ThisClass^ obj = gcnew ThisClass(99.0); 
ubh(obj, 5); 

有啥有兩種類型的呢?

// code for HandlerClass 
public ref class HandlerClass 
{ 
    public: 

    static void Fun1(int m) 
    { Console::WriteLine(L」Function1 called with value {0}」, m); } 
    static void Fun2(int m) 
    { Console::WriteLine(L」Function2 called with value {0}」, m); } 
    void Fun3(int m) 
    { Console::WriteLine(L」Function3 called with value {0}」, m+value); } 
    void Fun4(int m) 
    { Console::WriteLine(L」Function4 called with value {0}」, m+value); } 

    HandlerClass():value(1){} 
    HandlerClass(int m):value(m){} 

    protected: 

    int value; 
}; 
+0

你可以顯示'HandlerClass'的代碼嗎? 'Fun1'是靜態的嗎? –

+0

yup Fun1是靜態的 –

+0

然後它很清楚,是不是 - 一個版本是免費函數,一個是(非靜態)成員函數。 –

回答

2

不同之處在於目標對象值生成的確切時間。使用綁定委託在創建委託對象時會生成綁定委託,並且在此之後永遠不變。未綁定的委託不存儲對象引用,它在調用委託時生成。然後可以使用相同的委託來用不同的對象調用目標方法。

未綁定委託與C++成員函數指針的語法匹配。 C++中的綁定代表沒有直接的等價物。

+0

那麼,綁定代表的匹配就是一個'pair '我想...... –

+0

我認爲, std :: bind(&foo :: bar,obj,_1,_2,_3)'。 –

相關問題