Portál AbcLinuxu, 12. května 2025 03:26
/* 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;
}
ž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í?
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; }
static
.
int (Trieda::*callback)(int)
a potom ju zavolat cez retval = this->*callback(int);
.
#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; }
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.