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