Ukazatel na funkci jako atribut třídy – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Ukazatel na funkci jako atribut třídy – C / C++ – Fórum – Programujte.comUkazatel na funkci jako atribut třídy – C / C++ – Fórum – Programujte.com

 

yaqwsx+9
Posthunter
14. 7. 2008   #1
-
0
-

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?

Nahlásit jako SPAM
IP: 85.160.68.–
Life is too short to remove USB mass storage safely...
Správný drsňák udělá z konzole cokoliv
Anonymní uživatel
~ Anonymní uživatel
0 příspěvků
14. 7. 2008   #2
-
0
-

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

Nahlásit jako SPAM
IP: 89.203.160.–
bukaj0
Věrný člen
14. 7. 2008   #3
-
0
-

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)

Nahlásit jako SPAM
IP: 85.70.13.–
Jak se správně ptát? -> http://www.hash.cz/inferno/otazky.html[br][br] Po programování je člověk hladovej.
yaqwsx+9
Posthunter
15. 7. 2008   #4
-
0
-

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

Nahlásit jako SPAM
IP: 85.160.92.–
Life is too short to remove USB mass storage safely...
Správný drsňák udělá z konzole cokoliv
Anonymní uživatel
~ Anonymní uživatel
0 příspěvků
19. 7. 2008   #5
-
0
-

Mohl by mi nekdo objasnit proc by nefungovalo nacteni te funkce do pameti ( napriklad do pole char) a pote nastaveni ukazatele na to pole?

Nahlásit jako SPAM
IP: 85.160.93.–
bukaj0
Věrný člen
19. 7. 2008   #6
-
0
-

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?

Nahlásit jako SPAM
IP: 85.70.13.–
Jak se správně ptát? -> http://www.hash.cz/inferno/otazky.html[br][br] Po programování je člověk hladovej.
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 45 hostů

Podobná vlákna

Ukazatel na funkci — založil Kenvelo

Ukazatel na funkci — založil Jirka

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý