Předání metody třídy jako parametr fce – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Předání metody třídy jako parametr fce – C / C++ – Fórum – Programujte.comPředání metody třídy jako parametr fce – C / C++ – Fórum – Programujte.com

 

Doomista+1
Stálý člen
9. 12. 2013   #1
-
0
-

ahoj, mám-li:

class A{
	public:
		void f(){
		m(true);
		}
		void m(bool Play){
			if(Play){
			//...
			}
			else{
			Mix_HookMusicFinished(f);
			}
		}
		A(){}
		~A(){}
}

Mix_HookMusicFinished chce jako argument void(*music_finished), ale já nejsem schopen řádně předat funkci f jako parametr. Kompilátor mi radí syntax &A::f, ale nefunguje mi to. Tuším, že by se na to měl použít this operátor, ale s ním jsem ještě nikdy nepracoval. předem díky za pomoc

Nahlásit jako SPAM
IP: 195.113.191.–
Na vše stačí iostream...
vitamin+8
Grafoman
9. 12. 2013   #2
-
+1
-
Zajímavé

#1 Doomista

Metody sa od funkci lisia tym ze maju skryty parameter(pointer na objekt):

struct A{
	void f(){}
	static void g(){}
};
//Metoda A::f prebera 1 parameter, nie 0 ako by sa mohlo zdat. Funkcia g prebera 0 parametrov.

//prototym funkcie f si mozes predstavyt takto:
void f(A* this);


Predpokladam ze funkcia Mix_HookMusicFinished ocakava ako parameter pointer na funkciu bez parametrov co metoda A::f nie je (ma 1 skryty parameter this).

Nahlásit jako SPAM
IP: 195.28.77.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
Doomista+1
Stálý člen
9. 12. 2013   #3
-
0
-

#2 vitamin
chápu.. bohužel tím, že jsem změnil metodu na static jsem přišel právě o operátor this, který mi umožňoval volat zpětně ostatní metody té třídy :/

Nahlásit jako SPAM
IP: 90.176.176.–
Na vše stačí iostream...
Martin Kozibrátka0
Stálý člen
10. 12. 2013   #4
-
0
-

Ono bez větších úprav to asi neuděláš

template<class T>
void Mix_HookMusicFinished(void (T::*optr)(void), T &val)
{
	(val.*optr)();
}

class A{
	public:
		int i;
		void f()
		{
			i=789;
			m(true);
		}
		void m(bool Play)
		{
			if(Play)
			{
				//...
			}
			else
			{
				Mix_HookMusicFinished(&A::f, *this);
				int o=78;
			}
		}
		A(){}
		~A(){}
};
Nahlásit jako SPAM
IP: 88.83.169.–
Savana.cz - neomezený webhosting za pár kaček :)
vitamin+8
Grafoman
10. 12. 2013   #5
-
0
-

#4 Martin Kozibrátka
To moze rovno spravyt nieco taketo:

template<class Fnc>
void Mix_HookMusicFinished(Fnc fnc)
{
	fnc();
}
///alebo bez templatov
void Mix_HookMusicFinished(std::function<void(void)> fnc)
{
	fnc();
}

//...

Mix_HookMusicFinished([&](){this->f();});
Nahlásit jako SPAM
IP: 95.105.152.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
Martin Kozibrátka0
Stálý člen
14. 12. 2013   #6
-
0
-

#5 vitamin
Jednak jsem nepsal, že to nejde dalšími sta způsoby a jednak tvoje řešení nemusí fungovat na spoustě toolchainech.

Nahlásit jako SPAM
IP: 88.83.169.–
Savana.cz - neomezený webhosting za pár kaček :)
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, 78 hostů

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ý