BlinCT
29 жовтня 2019 р. 17:10

Список инициализации дял членов класса

Всем привет.
Появился маленький вопрсо по данной теме, со списком инициализации все понятно, если имеется булевая переменная то : value(false).
Но если например у члена класса надо вызватть функцию, как тогда это записывается?
Например QTimer *timeout, как в списке инициализации записать timeout->stop()?
Спасибо.

3

Вам це подобається? Поділіться в соціальних мережах!

14
BlinCT
  • 29 жовтня 2019 р. 17:59

Например вот такое как правильно инициализировать?

    m_timeout = new QTimer(this);
    connect(m_timeout, SIGNAL(timeout()), this, SLOT(timeoutFired()));
    m_timeout->setInterval(2000);
    m_timeout->start();

То есть коннект остается в теле конструктора, создание указателя понятно, а вот интервал и запуск.

    Evgenii Legotckoi
    • 29 жовтня 2019 р. 18:20

    Привет.
    Можешь также оставить в конструкторе класса.

      BlinCT
      • 29 жовтня 2019 р. 18:22

      А по поводу timeout->stop(), это должно быт ьв теле конструктора или в список инициализации это можно как то запсать?

        Evgenii Legotckoi
        • 29 жовтня 2019 р. 18:26

        Это должно быть там, где предполагает логика программы.
        То есть там и тогда, когда таймер нужно остановить. И это может быть в слоте timeoutFired .
        Или в любом другом методе.
        Какой смысл останавливать таймер в конструкторе, если там же его запускают?
        И уж тем более не в списке инициализации, получается, что таймер останавливают раньше, чем он вообще создался.

          МП
          • 29 жовтня 2019 р. 18:27
          • (відредаговано)

          Лямбда или статический метод. Второе на мой взгляд выглядит лучше.

          static QTimer* initTimer(YourClass* parent)
          {
              auto* timeout = new QTimer(parent);
              QObject::connect(timeout, SIGNAL(timeout()), parent, SLOT(timeoutFired()));
              timeout->setInterval(2000);
              timeout->start();
              return timeout;
          }
          
            Evgenii Legotckoi
            • 29 жовтня 2019 р. 18:33

            Остаётся лишь вопрос в другом. Насколько это действительно необходимо, использовать статические методы или лямбды для списка инициализации.

              МП
              • 29 жовтня 2019 р. 18:36

              Ну если класс родитель, например, таймер в конструкторе просит.

                Evgenii Legotckoi
                • 29 жовтня 2019 р. 18:46
                • (відредаговано)

                С тем же результатом можно подобный код добавить в тело конструктора.
                То есть здесь вопрос лишь в том, чтобы получить какую-то небольшую оптимизацию при инициализации в ущерб читаемости кода.
                Хорошо, статический метод не так перегрузит читаемость, но лямбда неплохо попортит кровь, увеличив сложность понимания. То есть читающий код программист должен будет обладать большим опытом, чем если бы это всё было сделано в теле конструктора.

                Я поэтому и написал, действительно ли это нужно. Ну либо я неправильно понял ваш комментарий, Михаил.

                  МП
                  • 29 жовтня 2019 р. 18:49

                  Почему не используете новый синтаксис коннекта?

                    МП
                    • 29 жовтня 2019 р. 18:51
                    • (відредаговано)
                    connect(timer, &QTimer::timeout, this, QOverload<>::of(&YourClass::update));
                    
                      МП
                      • 29 жовтня 2019 р. 19:17

                      Я только ответил как это можно сделать технически. Статические методы иногда используются для инициализации. Другой пример, константный указатель SomeClass * const ptr; не может быть проинициализирован в теле конструктора. Т.к. в теле идёт уже не инициализация, а присваивание.

                        Evgenii Legotckoi
                        • 29 жовтня 2019 р. 19:20

                        Я только ответил как это можно сделать технически.

                        Да, я понял. Спасибо. Интересно было Ваше мнение вообще в этом плане.

                          МП
                          • 29 жовтня 2019 р. 19:36

                          И ещё у QObject уже есть метод startTimer(). Возможно он вам больше подойдёт, если ваш класс унаследован от QObject. Хотя я предпочитаю использовать QTimer отдельно, как вы это и делаете.

                            МП
                            • 29 жовтня 2019 р. 20:01
                            • (відредаговано)

                            Ну и наконец, если нужно, чтобы таймер сработал только один раз, то у QTimer есть статический метод. QTimer::singleShot(600000, &app, SLOT(quit())); // из документации

                              Коментарі

                              Only authorized users can post comments.
                              Please, Log in or Sign up