BlinCT
Қаз. 29, 2019, 5:10 Т.Қ.

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

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

3

Ол саған ұнайды ма? Әлеуметтік желілерде бөлісіңіз!

14
BlinCT
  • Қаз. 29, 2019, 5: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, 6:20 Т.Қ.

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

      BlinCT
      • Қаз. 29, 2019, 6:22 Т.Қ.

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

        Evgenii Legotckoi
        • Қаз. 29, 2019, 6:26 Т.Қ.

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

          МП
          • Қаз. 29, 2019, 6: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, 6:33 Т.Қ.

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

              МП
              • Қаз. 29, 2019, 6:36 Т.Қ.

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

                Evgenii Legotckoi
                • Қаз. 29, 2019, 6:46 Т.Қ.
                • (өңделген)

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

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

                  МП
                  • Қаз. 29, 2019, 6:49 Т.Қ.

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

                    МП
                    • Қаз. 29, 2019, 6:51 Т.Қ.
                    • (өңделген)
                    connect(timer, &QTimer::timeout, this, QOverload<>::of(&YourClass::update));
                    
                      МП
                      • Қаз. 29, 2019, 7:17 Т.Қ.

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

                        Evgenii Legotckoi
                        • Қаз. 29, 2019, 7:20 Т.Қ.

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

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

                          МП
                          • Қаз. 29, 2019, 7:36 Т.Қ.

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

                            МП
                            • Қаз. 29, 2019, 8:01 Т.Қ.
                            • (өңделген)

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

                              Пікірлер

                              Тек рұқсаты бар пайдаланушылар ғана пікір қалдыра алады.
                              Кіріңіз немесе Тіркеліңіз