PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : State machine (memberfunc's)



brumm
05-04-2002, 12:51
An alle C++ Päpste

Möchte einen Automaten implementieren der über ein Feld von member functions angesprochen wird. Mit der Fehlermeldung des g++ komm' ich nicht klar und die Zunahme der grauen Haare wächst mittlerweile logarithmisch;-)

Hier ein Beispiel:

//Test finite state machine with member functions
#include <iostream.h>

class A
{
public:
enum STATE_E {OFF, MEDIUM, FULL, LAST}; //Zustandsnamen
A();
~A() {};

STATE_E state; //Enthält den augenblicklichen Zustand

void runAutomat();

private:
typedef void (A::*func_n)();
func_n array[LAST];

void func_OFF();
void func_MEDIUM();
void func_FULL();
};

A::A()
{
state = OFF;

array[OFF] = &A::func_OFF;
array[MEDIUM] = &A::func_MEDIUM;
array[FULL] = &A::func_FULL;
}

void A::func_OFF()
{
cout << "func_OFF" << endl;
state = MEDIUM;
}

void A::func_MEDIUM()
{
cout << "func_MEDIUM" << endl;
state = FULL;
}
void A::func_FULL()
{
cout << "func_FULL" << endl;
state = LAST;
}

void A::runAutomat()
{
A::array[state](); //!!! Error !!!!
}

int main()
{
A a;
do {a.runAutomat();}while(a.state != A::LAST);
return 0;
}

Vermute einen Syntaxfehler und werde auch aus der Literatur nicht schlau!
Hat da einer ne Idee??? Für brauchbare Ratschläge schon mal vielen Dank im Voraus.

By
brumm

jgbauman
06-04-2002, 01:10
Objekt das benutzt werden soll (this) + pointer-to-member Syntax (->*) + pointer-to-member (array[state]) + schoen eingeklammert wegen operator precedence ( ( ) > ->* bzw. call > member selection und wir brauchens umgekehrt) + Funktionsaufruf ( ( ) ) =

(this->*array[state])();

volia!

brumm
08-04-2002, 08:51
jgbaumann,

danke das wars. War schon relativ nahe dran, die Klammern standen falsch.
Aber manchmal ist das Brett vorm Kopf besonders dick.

ciao
brumm