Sdílet prostřednictvím


delegate (rozšíření komponent C++)

Deklaruje typ, který představuje ukazatel na funkci.

Všechny moduly runtime

Jak architektura prostředí Windows Runtime, tak modul CLR podporují delegáty.

Poznámky

Klíčové slovo delegate je citlivé na kontext.Další informace naleznete v tématu Kontextově závislá klíčová slova (rozšíření komponent C++).

Chcete-li zjistit, zda je typ delegátem, v době kompilace, použijte příznak typu __is_delegate().Další informace naleznete v tématu Podpora kompilátoru pro typové vlastnosti (C++ Component Extensions).

Prostředí Windows Runtime

Jazyk C++/CX podporuje delegáty s následující syntaxí.

Syntax

access delegate return-type delegate-type-identifier ([ parameters ])

Parametry

  • access
    (volitelné) Přístupnost delegáta, může být public (výchozí) nebo private.Prototyp funkce lze také kvalifikovat klíčovými slovy const nebo volatile.

  • return-type
    Návratový typ prototypu funkce.

  • delegate-type-identifier
    Název deklarovaného typu delegáta.

  • parameters
    (Volitelné) Typy a identifikátory prototypu funkce.

Poznámky

Použití delegate-type-identifier událost se stejný prototyp jako delegáta deklarovat.Další informace naleznete v tématu týkajícím se delegátů (C++/CX).

Požadavky

Možnost kompilátoru: /ZW

Common Language Runtime

Modul CLR podporuje delegáty s následující syntaxí.

Syntax

access delegate function_declaration

Parametry

  • access
    (volitelné) Přístupnost delegáta mimo sestavení může být public nebo private. Výchozí hodnotou je private. Uvnitř třídy může mít delegát jakoukoliv přístupnost.

  • function_declaration
    Signatura funkce, kterou lze svázat s delegátem.Návratový typ delegáta může být libovolný spravovaný typ.Z důvodu interoperability je vhodné, aby byl návratový typ delegáta typu CLS.

    Chcete-li definovat nevázané delegát, první parametr v function_declaration by měl být typ this ukazatel objektu.Další informace naleznete v tématu Nevázaný delegáty.

Poznámky

Delegáty jsou schopny vícenásobného volání: "ukazatel na funkci" může být svázán s jednou nebo více metodami uvnitř spravované třídy.Klíčové slovo delegate definuje typ delegáta vícesměrového vysílání s určitou signaturou metody.

Delegát může být také svázán s metodou třídy hodnoty, například statickou metodou.

Delegát má následující charakteristiky:

  • Dědí z třídy System::MulticastDelegate.

  • Má konstruktor, který přijímá dva argumenty: ukazatel na spravovanou třídu nebo hodnotu NULL (v případě vazby na statickou metodu) a plně kvalifikovanou metodu určeného typu.

  • Má metodu nazvanou Invoke, jejíž signatura se shoduje s deklarovanou signaturou delegáta.

Dojde-li k zavolání delegáta, jsou jeho funkce volány v pořadí, v němž byly připojeny.

Návratovou hodnotou delegáta je návratová hodnota naposled připojené členské funkce.

Delegáty nelze přetížit.

Delegáti mohou být vázaní či nevázaní.

Při tvorbě instance vázaného delegáta je prvním argumentem odkaz na objekt. Druhým argumentem tvorby instance delegáta je buď adresa metody objektu spravované třídy, nebo ukazatel na metodu typu hodnoty. Druhý argument tvorby instance delegáta musí uvést název metody úplnou syntaxí rozsahu třídy a použít operátor address-of.

Tvoříte-li instanci nevázaného delegáta, je prvním argumentem buď adresa metody objektu spravované třídy, nebo ukazatel na metodu typu hodnoty. Argument musí uvést název metody úplnou syntaxí rozsahu třídy a použít operátor address-of.

Při tvorbě delegáta na statickou nebo globální funkci je vyžadován pouze jeden parametr: samotná funkce (volitelně také její adresa).

Další informace o delegátech naleznete v tématech

Požadavky

Možnost kompilátoru: /clr

Příklady

Příklad

Následující příklad ukazuje, jak deklarovat, inicializovat a vyvolat delegáty.

// mcppv2_delegate.cpp
// compile with: /clr
using namespace System;

// declare a delegate
public delegate void MyDel(int i);

ref class A {
public:
   void func1(int i) {
      Console::WriteLine("in func1 {0}", i);
   }

   void func2(int i) {
      Console::WriteLine("in func2 {0}", i);
   }

   static void func3(int i) {
      Console::WriteLine("in static func3 {0}", i);
   }
};

int main () {
   A ^ a = gcnew A;

   // declare a delegate instance
   MyDel^ DelInst;

   // test if delegate is initialized
   if (DelInst)
      DelInst(7);
   
   // assigning to delegate
   DelInst = gcnew MyDel(a, &A::func1);

   // invoke delegate
   if (DelInst)
      DelInst(8);

   // add a function
   DelInst += gcnew MyDel(a, &A::func2);

   DelInst(9);

   // remove a function
   DelInst -= gcnew MyDel(a, &A::func1);

   // invoke delegate with Invoke
   DelInst->Invoke(10);

   // make delegate to static function
   MyDel ^ StaticDelInst = gcnew MyDel(&A::func3);
   StaticDelInst(11);
}

Výsledek

  
  
  
  
  

Viz také

Koncepty

Rozšíření komponent pro platformy běhového prostředí