4

次のコードが安全かどうかを自問します。

#include <QCoreApplication>
#include <QObject>
#include <QDebug>
#include <QTimer>

class Base : public QObject
{
    Q_OBJECT

public:
    Base()
    {
        // is it safe to do that ?
        connect(this, SIGNAL(signal1()), this, SLOT(slot1()));
    }
    virtual ~Base() {}

signals:
    void signal1();

public slots:
    virtual void slot1() = 0; // could be only virtual
};

class Derived : public Base
{
    Q_OBJECT

public slots:
    virtual void slot1()
    {
        qDebug() << "derived slot";
    }

    void emitSignal1()
    {
        emit signal1();
    }
};

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    Derived d;

    QTimer::singleShot(0, &d, SLOT(emitSignal1()));

    return a.exec();
}

#include "main.moc"

出力は期待どおりです:

derived slot

connectメソッドが舞台裏で何をしているのかは見ていませんが、コールバック関数を設定するようなものだと思います。

クラスコンストラクターに仮想メソッドの呼び出しがない場合、Baseこれまでのところ副作用は見られませんが、本当ですか?

ありがとうございました。

4

1 に答える 1