/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
jdjespers.. 500
kyllekylle 500
Bech_bb 500
scootergr.. 300
gibson 300
molokyle 287
10  strarup 270
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

> Jeg vil gerne have en array af pointere til memberfunktioner i en klasse.

Se evt. også på http://www.function-pointer.org/



Søg
Reklame
Statistik
Spørgsmål : 177500
Tips : 31968
Nyheder : 719565
Indlæg : 6408518
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste