Безопасно ли подключать сигнал к чисто виртуальному слоту в конструкторе базового класса?

Я спрашиваю себя, безопасен ли следующий код:

#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 голоса | спросил Scab 28 32018vEurope/Moscow11bEurope/MoscowWed, 28 Nov 2018 23:55:44 +0300 2018, 23:55:44

1 ответ


0
Нет проблем, потому что вызов слота не дается в конструкторе или деструкторе класса, а вызывается в цикле событий, что можно наблюдать в .moc:С другой стороны, желательно использовать новый синтаксис соединения:
ответил eyllanesc 29 42018vEurope/Moscow11bEurope/MoscowThu, 29 Nov 2018 01:12:17 +0300 2018, 01:12:17

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132