我何时应该使用指针或引用成员,何时应该在Qt中传递nullptr或this作为父指针?

时间:2014-09-19 09:20:12

标签: c++ qt pointers reference

守则

我一直在用Qt写这个c ++,知道它有效但不能理解为什么我有时做除了&#34之外的其他事情;我只知道我应该这样做"。

这是我的初始化类的启动类:

namespace GUI
{
    Startup::Startup() :
        QObject(nullptr),
        m_setupTab(*new SetupTab(nullptr)),
        m_regTab(*new CbcRegistersTab(nullptr)),
        m_dataTab(*new DataTestTab(nullptr)),

        m_mainView(*new MainView(nullptr,
                                 m_setupTab,
                                 m_regTab,
                                 m_dataTab)),

        m_systemController(*new SystemController(nullptr,
                                                 Provider::getSettingsAsSingleton())),

        m_dataTest(*new DataTest(nullptr,
                                m_systemController)),

        m_setupTabVm(new SetupTabViewManager(this,
                                             m_setupTab,
                                             m_systemController,
                                             Provider::getSettingsAsSingleton() ))

    {

    }

然后在我的头文件中,成员变量被描述为:

private:
    SetupTab& m_setupTab;
    CbcRegistersTab& m_regTab;
    DataTestTab& m_dataTab;

    MainView& m_mainView;
    Settings* m_settings;

    SystemController& m_systemController;

    DataTest& m_dataTest;

    SetupTabViewManager* m_setupTabVm;

视图管理器与其他所有内容之间的主要区别在于视图管理器在选项卡类和其他所有内容之间传递信号。

然后在我的主要开始这个,我所做的就是这个:

    GUI::Startup startup;
    startup.show();


SetupTabViewManager.cpp:

#include "setuptabviewmanager.h"
#include "View/setuptab.h"
#include "Model/systemcontroller.h"
#include "Model/settings.h"
#include <QDebug>

namespace GUI
{
    SetupTabViewManager::SetupTabViewManager(QObject *parent,
                                             SetupTab& tab,
                                             SystemController& sysCtrl,
                                             Settings& config) :
        QObject(parent),
        m_setupTab(tab),
        m_systemController(sysCtrl)
    {
        WireMessages(config);
        WireSetupTabButtons(config);
    }

    void SetupTabViewManager::WireMessages(Settings& config)
    {
        connect(&config, SIGNAL(notifyStatusMessage(QString)), //for QT4
                &m_setupTab, SLOT(onStatusUpdate(QString)) );

        connect(&m_systemController, SIGNAL(notifyStatusMessage(QString)),
                &m_setupTab, SLOT(onStatusUpdate(QString)));
    }

    void SetupTabViewManager::WireSetupTabButtons(Settings& config)
    {
        connect(&m_setupTab, SIGNAL(onBtnLoadSettingsClicked(bool)),
                &config, SLOT(onLoadButtonClicked(bool)) );

        connect(&config, SIGNAL(setHwTree(QStandardItemModel*)),
                &m_setupTab, SLOT(setHwTreeView(QStandardItemModel*)));

        connect(&m_setupTab, SIGNAL(onBtnInitClicked()),
                &m_systemController, SLOT(startInitialiseHw()));

        connect(&m_setupTab, SIGNAL(onBtnCfgClicked()),
                &m_systemController, SLOT(startConfigureHw()));

    }
}

问题

将成员变量中的类初始化为指针或引用有什么好处?我只知道当我创建一个&#34;视图管理器&#34;时,我应该将成员变量初始化为指针。虽然我不确定为什么?

&#34;这个&#34;的优点是什么?或&#34; nullptr&#34;作为班级的父母?

2 个答案:

答案 0 :(得分:2)

Qt对象在对象树中组织。它允许程序员不关心创建对象的描述:当删除各自的父项时,它们将被自动删除。

如果您查看几乎所有Qt GUI应用程序,那么您将看到它的所有小部件(按钮,复选框,面板等)都有一个单独的祖先 - 主窗口。删除主窗口时,将自动删除所有应用程序窗口小部件。

您可以通过将父对象传递给新创建的子对象来设置此父子关系:

QWidget *mainWidget = ...
QPushButton *btn = new QPushButton(mainWidget);

在这种情况下,btn对象成为mainWidget对象的子对象,从此刻起,您可能无法手动删除该子对象。

如果您创建的对象没有父对象,则应始终自行删除。

如评论中提到的 thuga ,您可以稍后转移对象所有权。窗口小部件可以放在布局中,它将使它们成为布局所有者的子项。或者您甚至可以使用QObject::setParent明确设置父级。

至于将类成员声明为指针或引用 - 这并不重要。这只是一个方便的问题。

答案 1 :(得分:0)

在Qt世界中,所有子对象在删除其父对象时都会被删除。如果你没有将类成员(QObjects)定义为指针,它们将被删除两次:一次被父级删除,第二次被你的类对象破坏,这可能导致未定义的行为。