Eli ongelma olisi seuraavanlainen:
Minulla on valmis funktio void funktio(void*()), joka siis saa argumentikseen osoittimeen toiseen funktioon. Tätä en pysty muuttamaan.
Sitten mulla on luokka jossa on funktio2:
class luokkaYksi
{
public: void funktio2();
};
nyt olisi tarkoitus tehdä tämä: funktio1(&luokkaYksi::funktio2)
Mutta tämäpä päätyy virheeseen 'argument of type ‘void (luokkaYksi::*)()’ does not match ‘void (*)()’'
Eli miten saisin muutettua osoittimen void (*)() tyyppiseksi?
Koodi näkyy paremmin täältä: http://pastebin.com/514894
Minulla on valmis funktio void funktio(void*()), joka siis saa argumentikseen osoittimeen toiseen funktioon. Tätä en pysty muuttamaan.
Sitten mulla on luokka jossa on funktio2:
class luokkaYksi
{
public: void funktio2();
};
nyt olisi tarkoitus tehdä tämä: funktio1(&luokkaYksi::funktio2)
Mutta tämäpä päätyy virheeseen 'argument of type ‘void (luokkaYksi::*)()’ does not match ‘void (*)()’'
Eli miten saisin muutettua osoittimen void (*)() tyyppiseksi?
Koodi näkyy paremmin täältä: http://pastebin.com/514894
Vastaukset 6
Vanhimmat
Jos ymmärsin kysymyksesi oikein, kokeile tätä mallia:
eli ensin prologit/kirjastot määritellään
#using
#using
sitten luokat
Class luokkaYksi
{
public: funktio2(int IA,int c)
private: funktio3(intA,intB)
}
Ja ensimmäinen pää-yhtälö
void main (int Kissa,*)
{
this->int IA
}
function yksi(luokkaYksi::&funktio kaksi)
{
int IA=3;
int c=2
}
Onkohan ihan päin mäntsälää;-]
on. Nutta kiitos kuitenkin ;D
Ongelma on se, että C-tyyliset funktiopointterit (void*()) ja C -tyyliset metodipointterit ((luokka::*)()) eivät ole keskenään vaihtokelpoisia.
Jos et tuota alkuperäistä 'funktio':ta pääse muuttamaan niin se vaikeuttaa asiaa.
Tarvitset siis viitteen siihen olioon, jolle ko. metodia haluat kutsua. Yksi mahdollisuus on tallentaa oliosta itse-viite tuon alkup. funktion saataville, jolloin voit toteuttaa sille välitettävän funktion seuraavasti:
void jossain() {
pOlio = luokka;
pFunktio = &luokkaYksi::funktio2;
funktio1(valefunktio2);
}
void valefunktio2() {
(pOlio->*pFunktio)();
}
Tämä ei tietysti toimi, jos kutsuja voi tulla asynkronisesti.
tässä "virallinen" tapa
http://libsigc.sourceforge.net/
Olin istunu puoli viikkoa tuon ongelman kanssa, mutta teidän vinkkien avulla se selvisi.
Kiitos :)
class luokkaYksi
{
public:
static void funktio2(luokkaYksi *me);
}
ja voit kutsua
funktio1( luokkaYksi:funktio2);
Nyt ongalmana vaan on että tuo funktio2 ei saa
this pointteria vaan kaikki viitaukset täytyy
tehdä tuon me pointerin kautta.