如何访问在类构造函数中创建的对象

时间:2019-02-28 19:35:09

标签: c++ qt

构造函数中的GUI类正在创建数据库类的新对象。看起来像这样:

GUI::GUI(QWidget *parent)
    : QMainWindow(parent)
{
    ui.setupUi(this);
    Baza *plik = new Baza();
    connect(ui.insertBtn, &QPushButton::clicked, this, &GUI::run);
}

我设法从QDialog获得用户输入:

void GUI::run() {
    DialogInput dialog;
    dialog.exec();
    site_text = dialog.getSite();
}

我应该如何传递site_text来在Baza类中起作用?我需要使用在GUI构造函数中创建的对象(副本),但无法从GUI::run()函数访问它。

2 个答案:

答案 0 :(得分:5)

let data = { title: 'Chair', tag: [ {name: 'Alpha'}, {name: 'Beta'} ] }; return sequelize.transaction().then(t => { return Product.updateOrCreate({ where: {title: data.title}, defaults: data, transaction: t }).then(res => { let [product] = res; return Promise.all(data.tag.map(tag => { return Tag.updateOrCreate({ where: {name: tag.name}, defaults: tag, transaction: t }).then(res => { let [tag] = res; return Promise.resolve(tag); }).catch(err => Promise.reject(err.message)); })).then(() => { t.commit(); sequelize.close(); }).catch(err => Promise.reject(err)); }).catch(err => { t.rollback(); sequelize.close(); }); }); 的声明中添加plik

GUI

然后在构造函数中

class GUI : public QWidget {
    // ...
    Baza* plik;
};

按照您的代码立场,GUI::GUI(QWidget *parent) : QMainWindow(parent) { ui.setupUi(this); plik = new Baza(); connect(ui.insertBtn, &QPushButton::clicked, this, &GUI::run); } 将在GUI构造函数完成后泄漏。

在析构函数中清理plik

plik

或者,使用GUI::~GUI() { // ... delete plik; } std::unique_ptr存储在plik中,因此您无需记住对其进行破坏。或者,如果GUIplik派生而来(例如,用于信号和时隙),则可以将其作为QObject的父项,Qt将处理该破坏。在这两种情况下,此建议均假设GUIplik具有相同的生存期。

答案 1 :(得分:0)

在构造函数内部创建指针时,对象的作用域一直到构造函数的结尾。

您需要为GUI类创建一个全局私有变量,以使该变量可以被同一类中的所有方法访问。 Baza * pLink;

在构造函数中创建指针时,请不要忘记在Destruction中删除相同的指针。

class GUI : public QWidget{
   //...
   GUI();
   ~GUI();
private:
   Baza * pLink;
}

GUI::GUI(QWidget *parent)
    : QMainWindow(parent)
{
    ui.setupUi(this);
    pLink = new Baza();
    connect(ui.insertBtn, &QPushButton::clicked, this, &GUI::run);
}

GUI::~GUI()
{
    delete pLink;
}

void GUI::run() {
    DialogInput dialog;
    dialog.exec();
    site_text = dialog.getSite();
    /* use the pointer to call the method to pass site_text */
    pLink->SomeMethod(site_text);
}

当您声明函数的局部变量和类的全局变量时,命名约定将发挥重要作用。 因此,请使用pLink或考虑使用m_pLink,其中m_将被添加到所有全局变量,而p将被添加到指针类型。