Portál AbcLinuxu, 12. května 2025 03:26

Dotaz: ukazatel na fci jako parametr funkce v c++

27.1.2011 17:49 Pepan
ukazatel na fci jako parametr funkce v c++
Přečteno: 703×
Odpovědět | Admin
Je možné v C++ použít ukazatel na funkci jako parametr jiné funkce?

Snažím se přesně o to, co je v níže uvedeném příkladu, ale s tím rozdílem., že fce jsou obalené ve třídě. Překladač na mě křičí, že mám špatný parametr fce NapisStoTecek.

Děkuju,


/* Tohle je jako časově náročná funkce z knihovny */
void NapisStoTecek(void (* callback)(int)) {
  int i;

  for (i = 0; i < 100; i++) {
    /* Jednou za deset teček zavolej parametr */
    if (!(i % 10)) callback(i);
    /* Vypisuj tečky */
    putchar('.');
  }
}

/* Funkce volaná z knihovny, ale definovaná v aplikačním kódu */
void parametr(int procent) {
  printf("\nHotovo na %i%%\n", procent);
}

/* Hlavní program */
int main(void) {
  NapisStoTecek(parametr);
  return 0;
}
Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

27.1.2011 18:11 Vojtěch Horký | skóre: 39 | blog: Vojtův zápisník | Praha
Rozbalit Rozbalit vše Re: ukazatel na fci jako parametr funkce v c++
Odpovědět | | Sbalit | Link | Blokovat | Admin
že fce jsou obalené ve třídě
A jak konkrétně? Jestli je parametr třídní funkce, tak pak má ve skutečnosti jako první parametr odkaz na this. Jestli si dobře pamatuji, tak v C++ jsou na tohle oblíbené šablony + funktory (třídy s operátorem ()).

Dodaný příklad funguje – jak vypadá ten, co se vzpouzí?
I am always ready to learn although I do not always like to be taught. (W. Churchill)
27.1.2011 18:20 l4m4
Rozbalit Rozbalit vše Re: ukazatel na fci jako parametr funkce v c++
Odpovědět | | Sbalit | Link | Blokovat | Admin
Doporučuji přečíst

http://www.parashift.com/c++-faq-lite/pointers-to-members.html#faq-33.1
27.1.2011 19:59 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: ukazatel na fci jako parametr funkce v c++

Příklad syntaxe obou variant (statická metoda a pointer na metodu):

#include <iostream>

class cls;

typedef void (*callback1)(char);
typedef void (cls::*callback2)(char);

class cls {
public:
  cls() {}

  static void cb1(char c) { std::cout << c; }
  void cb2(char c) { std::cout << c; }

  void use1(callback1 f) { (*f)('A'); }
  void use2(callback2 f) { (this->*f)('B'); }
};

int main()
{
  cls X;

  X.use1(cls::cb1);
  X.use2(&cls::cb2);
  std::cout << std::endl;
  
  return 0;
}
27.1.2011 19:41 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: ukazatel na fci jako parametr funkce v c++
Odpovědět | | Sbalit | Link | Blokovat | Admin
Pravděpodobně vám jde o pointer na metodu, ale těžko hádat, když neukážete ten příklad, se kterým máte problém, ale nějaký jiný, kde problém není.
30.1.2011 00:05 fsgsfg
Rozbalit Rozbalit vše Re: ukazatel na fci jako parametr funkce v c++
Odpovědět | | Sbalit | Link | Blokovat | Admin
Jasne, no problem: Pointers to functions (posledni odstavec dole). Pokud je ta funkce v nejake tride, pak se musi uvest cela trida. Treba Classa::addition.
30.1.2011 00:30 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: ukazatel na fci jako parametr funkce v c++
To ovšem funguje pouze pokud je ta metoda static.
30.1.2011 09:20 majvan | skóre: 5 | blog: Fandime linuxu | Trenčín
Rozbalit Rozbalit vše Re: ukazatel na fci jako parametr funkce v c++
Odpovědět | | Sbalit | Link | Blokovat | Admin
Musis ten callback deklarovat ako int (Trieda::*callback)(int) a potom ju zavolat cez retval = this->*callback(int);.
30.1.2011 15:53 __dark__
Rozbalit Rozbalit vše Re: ukazatel na fci jako parametr funkce v c++
Odpovědět | | Sbalit | Link | Blokovat | Admin
Tady je trochu víc k problematice:

http://www.codeproject.com/kb/cpp/FastDelegate.aspx
30.1.2011 18:04 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
Rozbalit Rozbalit vše Re: ukazatel na fci jako parametr funkce v c++
Odpovědět | | Sbalit | Link | Blokovat | Admin
To co teď napíšu neřeší tento případ, ale třeba je to odpovědí otázku, z které mohl vzniknout tento požadavek :)
#include <iostream>

/*Abstarct class as interface in the library */
class cosiPrintable {
  public:
    virtual void cosiDo(int procent) = 0; //or {};
};

/*Library  functions*/
class libraryFunctions {

  private:
    libraryFunctions();
    libraryFunctions(libraryFunctions &instance);
  public:
    static void NapisStoTecek(cosiPrintable *cosi)
    {
      int i;
      for (i = 0; i < 100; i++) {
        /* Jednou za deset teček zavolej parametr */
        if (!(i % 10))
          cosi->cosiDo(i);
        /* Vypisuj tečky */
        std::cout << ".";
        std::cout.flush();
      }
      cosi->cosiDo(100);
    }
};

//--------- END OF THE LIBRARY ----------------


/* My implementation  */
class myPrint : public cosiPrintable{
  public:
   virtual void cosiDo(int procent) {
     std::cout << std::endl << "Hotovo na " << procent << " %" << std::endl;
  }
};

/* Hlavní program */
int main(void) {
  myPrint myPrintInstance;
  libraryFunctions::NapisStoTecek(&myPrintInstance);
  return 0;
}
To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.