Zeiger auf Memberfunktionen

Hallo,

ich habe ein C++ Programm geschrieben und auf diversen Plattformen (Linux 4er und 6er Kernel, Mac OS X/Darwin, Windows XP,…) getestet. Es lief bisher tadellos.

Letzte Woche wollte ich das Programm auf meinem Powerbook (Mac OS X 10.4.8, gnu c++ 4.0.0) zum Laufen bringen und musste feststellen, dass es Probleme mit den Zeigern auf Memberfunktionen gibt. Das Bemerkenswerte dabei ist, dass das Programm auf anderen Powerbooks ohne Schwierigkeiten funktioniert.

Der folgende Quellcode extrahiert die kritische Stelle:

#include 

class A;
typedef void (A::\*func\_t)();

class B
{
 public:
 B( A \*a, func\_t func )
 {
 p\_a = a;
 p\_func = func;
 }

 int execute()
 {
 (p\_a-\>\*p\_func)();
 return 0;
 }

 private:
 A \*p\_a;
 func\_t p\_func;
};

class A
{
 public:
 A()
 {
 p\_b = new B( this, &A::function );
 }

 ~A()
 {
 delete p\_b;
 }

 void run()
 {
 p\_b-\>execute();
 }

 void function()
 {
 std::cout run();
 delete a;

 return 0;
}

Kompilieren und Ausführen…

$ g++ main.cpp -o test
$ ./test

…sollte eigentlich folgenden Text auf die Standardausgabe bringen:

This message will not be seen on my mac.

Und tatsächlich passiert dies auf allen Rechnern (Intel/Linux, Intel/Windows, PPC/Mac OS X), außer auf meinem Powerbook. Die Funktion A::function() wird überhaupt nicht betreten.

Verlasse ich mich vielleicht auf eine Funtionalität von C++, die zwar meistens gilt, aber nicht vom Standard garantiert wird? Wer kann mir weiterhelfen?

Viele Grüße,
Jens

Hallo,

ich habe zwar keine Ahnung von Mac’s, hätte aber eine Vermutung.
Könnte es sein, dass es an deinem Compiler liegt???
Vielleicht einfach mal eine neuere oder auch eine ältere Version ausprobieren!?

Hallo x303,

Könnte es sein, dass es an deinem Compiler liegt???
Vielleicht einfach mal eine neuere oder auch eine ältere
Version ausprobieren!?

Da hast du wohl genau ins Schwarze getroffen. Ich habe meine gcc version von 4.0.0 auf 4.0.1 aktualisiert und seitdem funktioniert die Sache mit den Zeigern auf Memberfunktionen einwandfrei. Da wird wohl in der 4.0.0-Version ein Bug enthalten gewesen sein.

Viele Grüße,
Jens