Я согласен с @molbdnilo, что вы должны сделать h1, e2, ... членами класса вместо локальных переменных в конструкторе.Но в этом случае есть еще одно соображение: время жизни QObject
экземпляров является особенным, потому что отношения родитель / потомки между ними, так что потомки могут быть автоматически уничтожены при уничтожении родителя.Я рекомендую вам эту книгу (также доступны печатные версии на бумаге).Специально глава 2 о классах и глава 8 о QObject
и других важных классах Qt.Эта книга является учебной программой, вы должны следовать ей от начала до конца, а также читать другие книги.
controller.h
class Controller : public QObject
{
Q_OBJECT
public:
explicit Controller(QObject *parent = nullptr);
~Controller(); // the destructor
// ... more public members
signals:
// ...
public slots:
// ...
private:
commonReaderClass *m_h1;
commonReaderClass *m_e2;
// ...
};
Я переименовал переменные h1 в m_h1 и e2 вm_e2, следующий общему соглашению для имен переменных-членов, а имя класса Controller, начинающееся с заглавной буквы, является еще одним распространенным соглашением об именах.
controller.cpp (классический способ C ++)
Controller::Controller(QObject *parent) : QObject(parent)
{
m_h1 = new heart_1_Sensor;
m_e2 = new eye_2_Sensor;
// ...
}
Controller::~Controller()
{
delete m_h1;
delete m_e2;
// ...
}
controller.cpp (способ Qt)
Controller::Controller(QObject *parent) : QObject(parent)
{
m_h1 = new heart_1_Sensor(this);
m_e2 = new eye_2_Sensor(this);
// ...
}
Controller::~Controller()
{ }
Вторая версия controller.cpp обычно предпочтительнее при написании программ на основе Qt.Следует помнить, что в C ++ каждый указатель, инициализированный операцией new
, должен иметь соответствующую операцию delete
.В C ++ нет автоматической «сборки мусора», но QObject
предоставляет довольно удобный механизм автоматического удаления дочерних объектов, поэтому деструктор во второй версии может быть пустым или его можно полностью опустить.