|
| pointer til memberfunction Fra : Peter Niels Jacobsen |
Dato : 11-12-02 13:03 |
|
Jeg vil gerne have en array af pointere til memberfunktioner i en klasse.
Alle funktionerne har samme udseende, blot forskellige navne og
implementation. Hvis jeg har en array med pointere til dem, så kan jeg
nemmere håndtere hvilke der skal kaldes i hvilke situationer.
jeg har prøvet at omskrive en alm function pointer definition fra
typedef void (*TSomeFunc)(int);
til
typedef void (*CSomeClass::TSomeFunc)(int);
og div. andre versioner, men kannikke rigtig finde en syntax som compileren
gider tage til sig.
Hvordan er den korrkte syntex hvis jeg ønsker noget alla dette:
class CSomeClass
{
void Function1(int Var);
void Function2(int Var);
void Function3(int Var);
void Caller(void)
};
typedef void (*CSomeClass::TSomeFunc)(int);
CSomeClass::Caller(void)
{
TSomeFunc FunctionArray[3]={Function1,Function2,Function3};
(FunctionArray[SomeIndex])(567);
}
.......
dette er kun et helt overfladisk eksempel for at illustrere hvad det er jeg
vil. Nu har jeg en gigantisk switch statement som vælger mellem at kalde de
mange mange forskellige functioner. Jeg vil gerne kunne bruge et index til
direkte at pille pointeren til funktionen ud af en array.
Men igen... hvordan pokker er lige syntaksen for pointere til member
funktioner?
| |
Igor V. Rafienko (11-12-2002)
| Kommentar Fra : Igor V. Rafienko |
Dato : 11-12-02 14:03 |
|
[ Peter Niels Jacobsen ]
[ ... ]
> jeg har prøvet at omskrive en alm function pointer definition fra
> typedef void (*TSomeFunc)(int);
> til
> typedef void (*CSomeClass::TSomeFunc)(int);
>
> og div. andre versioner, men kannikke rigtig finde en syntax som
> compileren gider tage til sig.
Ta en titt i TC++PL3ed.
R (C::*MF)( AL );
der
R -- returtypen
C -- klassen
MF -- navnet på pekeren
AL -- argumentliste (som i en "vanlig" deklarasjon)
[ ... ]
> class CSomeClass
> {
> void Function1(int Var);
> void Function2(int Var);
> void Function3(int Var);
> void Caller(void)
> };
>
> typedef void (*CSomeClass::TSomeFunc)(int);
>
> CSomeClass::Caller(void)
> {
> TSomeFunc FunctionArray[3]={Function1,Function2,Function3};
> (FunctionArray[SomeIndex])(567);
> }
> ......
En nødvendig forutsetning for å kunne kalle en member function er at
man har et objekt å kalle denne member function på. C++ har valgt å
kreve et slikt objekt eksplisitt oppgitt og det med en syntaks
forskjellig fra "vanlige" funksjonskall.
Altså:
struct foo
{
foo();
void bar();
void method1(){ std::cout << "foo::method1\n"; }
void method2(){ std::cout << "foo::method2\n"; }
void method3(){ std::cout << "foo::method3\n"; }
typedef void (foo::*foo_memf_t)( void );
};
foo :: foo()
{
// I don't like C-style arrays.
std::vector< foo_memf_t > array;
array.push_back( &foo::method1 );
array.push_back( &foo::method2 );
array.push_back( &foo::method3 );
// let's call it on 'this'
(this->*array[0])();
}
Temmelig jævlig, hva? Dersom du har en reference framfor en peker til
et objekt, så bruker man operatoren .* framfor ->*
Derfor kan man kanskje prøve å bruke STL sine wrappere rundt dette
faenskapet. Dog jeg er ikke sikker på hvorvidt det faktisk _er_
lettere for øyne. Altså:
void
foo :: bar()
{
std::vector< std::mem_fun_t< void, foo > > array;
array.push_back( std::mem_fun( &foo::method1 ) );
array[0]( this );
}
Dessverre er det slik at det finne adaptere kun for 0- og 1-
argumentsfunksjoner i STL. Resten må man fikse selv (mao. det ville ha
vært kjekt med en generisk "apply", but I digress).
> Men igen... hvordan pokker er lige syntaksen for pointere til member
> funktioner?
Hvordan? Tja, ca. som Russlands innsats i internasjonal ishockey de
siste (ca.) 4 år -- jævlig.
ivr
--
<peder> igorr: tcl ja... det er fra de dypeste avgrunnene i helvete det...
<peder> php er bare fra foajeen
-- pederst på irc
| |
Peter Niels Jacobsen (11-12-2002)
| Kommentar Fra : Peter Niels Jacobsen |
Dato : 11-12-02 17:16 |
|
<snip forklaring>
> (this->*array[0])();
Takker mange gange for det grundige svar. Det var lige hvad jeg skulle bruge
for at komme videre
| |
Morten F. Hansen (11-12-2002)
| Kommentar Fra : Morten F. Hansen |
Dato : 11-12-02 14:08 |
| | |
|
|