osoitinongelma(c++)

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
6694
Äänestä

Muut lukivat myös

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ää;-]

Äänestä
  • on. Nutta kiitos kuitenkin ;D

    Äänestä

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.

Äänestä

Olin istunu puoli viikkoa tuon ongelman kanssa, mutta teidän vinkkien avulla se selvisi.

Kiitos :)

Äänestä

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.

Äänestä

Kommentoi aloitusta


Johnnie83 kirjoitti:

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

Anonyymi
5000

Ilmoita asiaton sisältö

  • Sisältää materiaalia, joka on loukkaavaa, herjaavaa, rasistista, uhkailevaa tai ahdistelevaa.

  • Materiaali sisältää nimiä, yhteystietoja tai muita henkilökohtaisia tietoja. Julkisuuden henkilöistä, julkisissa viroissa toimivista ihmisistä sekä yritysten vastuuhenkilöistä saa keskustella työhön liittyen. Myös yksityiselämään liittyvistä asioista voi keskustella siltä osin, kuin niistä on julkisesti kerrottu.

  • Sisältää lapsille haitallista tai heiltä kiellettyä materiaalia. Seksuaalinen sisältö on sallittua aiheeseen tarkoitetuilla palstoilla, joiden ikäraja on 18 vuotta.

  • Lainvastaista sisältöä voi olla mm. yksityiselämää loukkaavan tiedon levitys, kiihottaminen kansanryhmää vastaan, laiton uhkaaminen, alaikäisiin liittyvä seksuaalinen sisältö/grooming, petokset, identiteettivarkaudet, kunnianloukkaukset ja tekijänoikeusrikkomukset.

  • Sisältö ei liity palstan tai keskusteluketjun aiheeseen.

  • Viesti ei ole suomea tai ruotsia (pl. International Forums), se sisältää mainontaa, se sisältää tekijänoikeuksin suojattua materiaalia, se on massapostitus tai jokin muu syy.

Jaa keskustelu