Sdílet prostřednictvím


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

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

Všechny moduly runtime

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

3z2x4f55.collapse_all(cs-cz,VS.110).gifPozná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í.

3z2x4f55.collapse_all(cs-cz,VS.110).gifSyntaxe

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

3z2x4f55.collapse_all(cs-cz,VS.110).gifParametry

  • 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.

3z2x4f55.collapse_all(cs-cz,VS.110).gifPoznámky

Chcete-li vytvořit událost s prototypem shodným s delegátem, použijte parametr delegate-type-identifier.Další informace naleznete v tématu týkajícím se delegátů (C++/CX).

3z2x4f55.collapse_all(cs-cz,VS.110).gifPožadavky

Možnost kompilátoru: /ZW

Modul CLR (Common Language Runtime)

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

3z2x4f55.collapse_all(cs-cz,VS.110).gifSyntaxe

access delegate function_declaration

3z2x4f55.collapse_all(cs-cz,VS.110).gifParametry

  • 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, měl by prvním parametrem v deklaraci funkce function_declaration být typ ukazatele this daného objektu.Další informace naleznete v tématu Nevázaný delegáty.

3z2x4f55.collapse_all(cs-cz,VS.110).gifPozná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

3z2x4f55.collapse_all(cs-cz,VS.110).gifPožadavky

Možnost kompilátoru: /clr

3z2x4f55.collapse_all(cs-cz,VS.110).gifPří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

Součást rozšíření pro Runtime platformy