为什么我的静态指针不可访问

why is my static pointer not accessible

本文关键字:访问 指针 我的 静态 为什么      更新时间:2023-10-16

我正在Qt中制作一个c++应用程序,并希望在调用相应ui类的构造函数时加载登录键盘(QWidget)。每次切换到登录窗口时都会调用构造函数。当我离开这个窗口时,析构函数被调用,所有东西都被销毁,所以我没有在RAM中留下任何位。我还希望只有一个键盘实例(单例),然后在需要时隐藏()和显示()。

当我第一次调用构造函数时,我创建了一个键盘实例并将其添加到我的垂直布局中。这很好。但是当我第二次调用构造函数时,例如当我切换到另一个窗口并切换回我的登录窗口时,那么我的静态键盘变得不可达。这是我的调试器说…这是遥不可及的。我已经有了键盘的实例我只是想把它添加到我的垂直布局中我不明白为什么我不能访问它。也许这是静态变量的一些属性,我真的不知道,因为我是c++的新手。这是我的代码

#ifndef LOGINKEYBOARD_H
#define LOGINKEYBOARD_H
#include <QWidget>
namespace Ui
{
    class LoginKeyboard;
}
class LoginKeyboard : public QWidget
{
    Q_OBJECT
public:
    explicit LoginKeyboard(QWidget *parent = 0);
    ~LoginKeyboard();
    static LoginKeyboard * instance()
    {
     if (!loginKeyboard)
     {
        loginKeyboard = new LoginKeyboard();
     }
     return loginKeyboard;
    }
private:
    Ui::LoginKeyboard *ui;
    static LoginKeyboard * loginKeyboard;
private slots:

};
#endif // LOGINKEYBOARD_H
#include "headerFiles/loginkeyboard.h"
#include "ui_loginkeyboard.h"
LoginKeyboard *LoginKeyboard::loginKeyboard = 0;
LoginKeyboard::LoginKeyboard(QWidget *parent) : QWidget(parent), ui(new Ui::LoginKeyboard)
{
    ui->setupUi(this);
}
LoginKeyboard::~LoginKeyboard()
{
    delete ui;
}

#include "headerFiles/support.h"
#include "ui_support.h"
#include "headerFiles/mainwindow.h"
#include "headerFiles/loginkeyboard.h"
Support::Support(QWidget *parent) : QWidget(parent), ui(new Ui::Support)
{
    ui->setupUi(this);     
    MainWindow::setPreviousPage(MainWindow::widgetStack->first());
    ui->verticalLayout->addWidget(LoginKeyboard::instance()); //error when it gets called the 2nd time
}
Support::~Support()
{
    delete ui;
}

当您添加LoggingKeyboard的静态实例时,它将在布局被破坏时被删除。

看到

注意:item的所有权被转移给了布局,它是布局的责任来删除它。

所以使用QWidget的单例子类不是一个好主意。如果你真的需要单例属性-你可以提取必要的功能到一个不同的类(这将不会子类化QWidget),并从LoginKeyboard中使用它。然而,如果你不真的需要它——那就不要这样做——单例应该尽可能避免,因为它们只是全局变量的美化版本,可能会导致各种难以跟踪的bug。