Как получить доступ к объекту, созданному в конструкторе класса - PullRequest
0 голосов
/ 28 февраля 2019

Мой класс графического интерфейса в конструкторе создает новый объект моего класса базы данных.Это выглядит так:

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 классе?Мне нужно использовать этот объект (plik), созданный в конструкторе GUI, но я не могу получить к нему доступ из функции GUI::run().

Ответы [ 2 ]

0 голосов
/ 28 февраля 2019

Когда вы создаете указатель внутри конструктора, область действия объекта остается до конца конструктора.

Вам необходимо создать глобальную частную переменную для класса 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 для типа указателя.

0 голосов
/ 28 февраля 2019

Добавьте 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);
}

Когда ваш код остается, plik просочится, как толькоЗавершение конструктора GUI.

Очистка plik в деструкторе:

GUI::~GUI()
{
    // ...
    delete plik;
}

В качестве альтернативы, используйте std::unique_ptr для хранения plik в GUI, поэтому вам не нужноне забудьте разрушить это.Или, если plik извлекает выгоду из QObject (например, для сигналов и слотов), вы можете связать его с GUI, и Qt будет обрабатывать уничтожение.В обоих случаях этот совет предполагает, что plik имеет то же время жизни, что и GUI.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...