Использование указателей для атрибутов QObject

С тех пор как я изучил Qt, меня смутил тот факт, что в документациях и книгах, которые я читал, они используют указатели для атрибутов, которые являются экземплярами подклассов QObject, таких как виджеты.

Я знаю, что объекты QObject удаляют своих детей, но не следует ли нам избегать использования указателей, кроме случаев, когда это действительно необходимо?

Вот рабочий пример, в котором я не использую указатели:

Widget.h файл:

#include <QSlider>
#include <QLabel>
#include <QVBoxLayout>

class Widget : public QWidget
{
Q_OBJECT

public:
Widget(QWidget *parent = 0);

public slots:
void change(int);
private:
QSlider m_slider;
QLabel m_label;
QVBoxLayout m_layout;
};

и файл Widget.cpp:

#include "Widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
, m_slider(Qt::Horizontal)
, m_label("0")
, m_layout(this)
{
m_layout.addWidget(&m_slider);
m_layout.addWidget(&m_label);

connect(&m_slider, SIGNAL(valueChanged(int)), this, SLOT(change(int)));
}

void Widget::change(int n){
m_label.setText(QString::number(n));
}

единственное отличие здесь в том, что я должен включить заголовок в файл Widget.h, это будет причиной использования указателей?

И я хочу добавить, что я видел похожий вопрос о StackOverflow, но ответ был таков: виджеты должны жить между вызовами функций, но это достигается здесь, когда они используются в качестве атрибутов.

4

Решение

Похоже, здесь идет довольно длительное обсуждение этого же вопроса:
Член класса: указатель или переменная?

Некоторые из пунктов этой ссылки говорят о:

  • Долгоживущие и недолговечные объекты
  • Куча против стека
  • Гарантированный заказ деструкторов на основе родительских заданий на объекты

Похоже, что отсюда дело не в жестком и быстром правиле, а в каждом конкретном случае. Поскольку в настоящее время я также перехожу из PyQt -> Qt и собираю свой C ++, мое ограниченное мнение до сих пор состоит в том, что я всегда использую указатели для членов класса, которые являются подклассами QObject. Я просто чувствую, что знаю, что они будут уничтожены только процессом уничтожения Qt parent-> child.

Опять же, это ограниченная перспектива. Я уверен, что кто-то с большим опытом C ++ может предложить лучший ответ. Но ссылка, на которую я ссылался, включает в себя очень опытных программистов на Qt.

5

Другие решения

Может быть, просто использовать конструктор, отличный от конструктора по умолчанию?

0

По вопросам рекламы [email protected]