Есть такой код
C++ (Qt)
#include <QtCore/QCoreApplication>
#include <QtCore/QtGlobal>
#include <QtCore/QtDebug>
#include <QtCore/QEventLoop>
#include <QtCore/QTimer>
#define USE_LOOP2 0
#if USE_LOOP2 == 1
static QEventLoop *loop2=0;
#endif
class Base
{
public:
Base()
{
#if USE_LOOP2 == 1
loop2 = new QEventLoop;
#endif
};
virtual void foo() = 0;
static QEventLoop * eventLoop()
{
#if USE_LOOP2 == 1
return loop2;
#else
if (loop) {
return loop;
} else {
return new QEventLoop(qApp);
}
#endif
}
virtual ~Base(){};
private:
#if USE_LOOP2 != 1
static QEventLoop *loop;
#endif
};
#if USE_LOOP2 != 1
QEventLoop *Base::loop=0;
#endif
class A : public Base
{
public:
A(){}
virtual ~A(){}
void foo()
{
qDebug() << "Run exec...";
qDebug() << eventLoop()->exec();
qDebug() << "Exit exec...";
}
};
int main(int argc, char *argv[])
{
QCoreApplication app(argc, argv);
A a;
QTimer::singleShot(6000, a.eventLoop(), SLOT(quit()));
a.foo();
QTimer::singleShot(6000, &app, SLOT(quit()));
return app.exec();
}
Если я использую статический указатель
loop как член Base класса, то метод
foo() никогда не возвращает управления и не реагирует на истекший таймер. Если я использую глобальный статический указатель
loop2, то всё работает нормально. Для эксперимента можете менять дефайн USE_LOOP2=0/1. В чем косяк?