Toon posts:

[C++] function pointers naar class functions

Pagina: 1
Acties:

Verwijderd

Topicstarter
Dit zijn de definities:

C++:
1
2
3
4
5
6
7
8
9
10
typedef bool (LabelInput::*OPERATION)(bool);
struct FP
{
  FP(             ) : fp(NULL) { }
  FP( OPERATION f ) : fp(f)    { }

  OPERATION fp;
};

std::map<int, FP>   buttonChooser;


En dit is hoe het (zou moeten) aangeroepen worden:
C++:
1
2
3
4
5
6
    std::map<int, FP>::iterator ii = buttonChooser.find(event.GetKeyCode());
    if ( ii != buttonChooser.end() )
    {
      FP& f = ii->second;
      f.fp;
    }


Nu zit ik hier wel met een probleempke...
Ik werk met Visual Studio, dus ik kan zien dat in "f.fp" mijn functie zit (zie screenshot).
Afbeeldingslocatie: http://www.karelsoft.be/Untitled-1.jpg

Nu is het vreemde (en waarschijnlijk mis ik het weer hier :S)... Als ik door mijn code step dan skipped hij gewoon "f.fp;", percies alsof dit een lege regel is...

Hoe kan ik die opgeslagen functie toch uitvoeren?

Thx

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-05 23:07

.oisyn

Moderator Devschuur®

Demotivational Speaker

Anders lees je even je C++ boek mbt member function pointers :?

C++:
1
      f.fp


Dat zegt net zoveel als het volgende:
C++:
1
2
3
4
5
6
7
8
9
10
struct S
{
    int i;
};

int main ()
{
    S s;
    s.i;  // <--- deze regel bedoel ik
}


f.fp is gewoon een value-type, je gebruikt het als een statement, maar je doet er verder niets mee. En sowieso, als ie met die code de functie zou aanroepen, hoe zou je dan de pointer moeten assignen aan een andere variabele? Als je logisch redeneert ben je dus gewoon haakjes vergeten (een functieaanroep is namelijk een identifier met haakjes erachter), maar dat is het helaas niet; member function pointers kun je niet zo behandelen als gewone functies.

Een member function pointer wijst, net als een gewone function pointer, naar een functie. Alleen is die functie onderdeel van een klasse. Toekenning gaat op deze manier:

C++:
1
2
3
4
5
6
7
struct S
{
    void blaat ();
};

void (S::*func) ();
func = &S::blaat;


Zoals je ziet laat je func wijzen naar blaat in S. Wat ik hiermee probeer duidelijk te maken is dat er geen instantie van S zit gekoppeld aan func. Je hebt nu een pointer naar een functie van S, maar je hebt nog geen object waar je de functie op aan gaat roepen. En dat gaat, zoals je in de documentatie kunt lezen ;), als volgt:
C++:
1
2
S s;
(s.*func) ();


Nu roep je de functie waar func naar wijst aan op s. Zonder een referentie naar het object kun je 'm dus ook niet aanroepen, en daarom gaat jouw code dus ook nooit werken. Je moet dus, naast de function pointer, ook nog eens een referentie naar het object opslaan waarop de functie moet worden aangeroepen. Dat kan bijvoorbeeld in je FP object.

[ Voor 3% gewijzigd door .oisyn op 10-05-2004 01:54 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Topicstarter
Mja, het handboek dat ik hier heb (ISBN 1852334835 - Multi-paradigm Programming using C++), dat spendeerd maar 1 pagina van de 300 aan dit. En dan nog enkel pointers naar class members (en niet naar functions).

De truck ligt er dus gewoon in ook de instantie mee op te slaan ;-). Met dank voor deze verduidelijking .oisyn! Het werkt perfect nu :D.