Jde použít ukazatel na funkci jako atribut třídy? JAk by vypadal kód? A bylo by možné si funkci uložit do externího souboru a poté ji díky ukazateli ze souboru nakopírovat do RAM?
Fórum › C / C++
Ukazatel na funkci jako atribut třídy
> Jde použít ukazatel na funkci jako atribut třídy?
ano
> JAk by vypadal kód?
class Xyz
{
public:
Xyz(int (*fn)(double cislo))
: fn_(fn)
{
}
int ZavolejFunkci(double d)
{
assert(fn_ != 0);
return fn_(d);
}
private:
int (*fn_)(double cislo); // Ukazatel na funkci vracejici int s parametrem typu double
};
> A bylo by možné si funkci uložit do externího souboru a poté ji díky ukazateli ze souboru nakopírovat do RAM?
Možné by to asi bylo, ale ukazatele není obecně dobré ukládat do souborů jako data. To má smysl jenom jako ladící informace, ale jinak ne. Možná by to i fungovalo, ale při sebemenší změně programu (nebo parametrů překladu) by to přestalo fungovat se staršími daty.
Lepší je uložit si to pod nějakým číslem nebo textově a při načítání to zpětně převést.
yaqwsx
Jde použít ukazatel na funkci jako atribut třídy? JAk by vypadal kód?
Určitě to jde. Kód vypadá stejně, jako kdybys použil odkaz fci jinde:
#include <iostream>
class Foo
{
public:
void (*fce)(void);
void exec()
{
fce();
}
};
void bar(void)
{
std::cout << "hello from bar!" << std::endl;
}
void baz(void)
{
std::cout << "hello from baz!" << std::endl;
}
int main(void)
{
Foo f;
// bar()
f.fce = &bar;
f.fce(); // vypíše: hello from bar!
f.exec(); // taky
// baz()
f.fce = &baz;
f.fce(); // vypíše: hello from baz!
f.exec(); // taky
return 0;
}
A bylo by možné si funkci uložit do externího souboru a poté ji díky ukazateli ze souboru nakopírovat do RAM?
Teď si nejsem úplně jistý, co tím myslíš. Jestli spustit program, který by zapsal adresu funkce do souboru a při dalším spuštění by načetl ukazatel ze souboru a funkci by pak používal, tak to je možné, ale prakticky by ses po každé rekompilaci programu musel potýkat s tím, že funkce mohla změnit svou adresu.
Další možnost je, že potřebuješ uložit celé tělo funkce (všechny její instrukce) do souboru, soubor pak namapovat do paměti a používat funkci/e, které obsahuje. Pak by bylo jednodušší použít nějakou z možností kompilátoru -- zkompilovat si kód odděleně (hlavní program do jedné binárky a načítanou fci/e do jiného) a použít nějaký dynamický loader. Např. pro Linux je zde dlopen() (http://www.isotton.com/devel/docs/C++-dlopen-mini-HOWTO/C++-dlopen-mini-HOWTO.html). (Myslím, že je to v POSIXu, takže by to mělo být dostupné i pro jiné Unixy.)
*EDIT: Tak pozdě. Jsem slimejš :o)
Díky, oživili jste mi paměť.
Ten externí soubor jsme myslel tak, že bych měl soubor s tělem funkce a tu bych pak namapoval na ten ukazatel... Ale to by byl jenom takový kosmetický doplněk.
Díky za rady
Mohl by mi nekdo objasnit proc by nefungovalo nacteni te funkce do pameti ( napriklad do pole char) a pote nastaveni ukazatele na to pole?
Anonymní uživatel
Mohl by mi nekdo objasnit proc by nefungovalo nacteni te funkce do pameti ( napriklad do pole char) a pote nastaveni ukazatele na to pole?
Nevím, že by to tu někdo psal. Nejspíš by to jakžtakž šlo. Ale proč to dělat, když tu dynamické loadery jsou?
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
Změnna hodnoty proměnné, jako atribut — založil smajdalf3
Ukazatel na funkci — založil Kenvelo
Ukazatel na funkci — založil Jirka
C++ - Třídy (Export funkcí z třídy do jiné) — založil CodeHustla
Ukazatel na clenskou funkci v tride — založil Kenvelo
Moderátoři diskuze