Methodenzeiger entsprechen grundsätzlich Funktionszeigern, allerdings ist es ein Zeiger auf eine Methode, die sich innerhalb einer vorher angegebenen Klasse befinden muss. Im Gegensatz zum Funktionszeiger, braucht man um eine Methode aufzurufen, auch ein Objekt entsprechenden Typs. Ein Beispiel: | #include "stdio.h"
class Snafu
{
private:
int Value;
public:
Snafu( int value ) : Value( value ) {}
int Add( int rhs ) { return Value + rhs; }
int Sub( int rhs ) { return Value - rhs; }
void Print( int rhs, int (Snafu::*function)( int ) )
{
printf( "Value modifiziert um %d ergibt: %d\n", rhs, (this->*function)( rhs ) );
}
};
void staticfunc( Snafu & snafu, int rhs, int (Snafu::*function)( int ) )
{
printf( "Berechne über Referenz: %d\n", (snafu.*function)( rhs ) );
}
int main( void )
{
Snafu var( 10 );
var.Print( 4, &Snafu::Add );
var.Print( 7, &Snafu::Sub );
staticfunc( var, 4, &Snafu::Add );
staticfunc( var, 7, &Snafu::Sub );
} |
Bemerkenswert ist, dass die Argumente des .* und des ->* Operators geklammert werden müssen. Dies gilt ebenso für den ::*-Operator im Funktionskopf. Auch kann this-> nicht wie üblich weggelassen werden, sondern ist zwingend verlangt. Der letzte Punkt ist, dass der AddressOf-Operator bei der Funktionsübergabe verlangt wird. |