为什么我的静态指针无法访问

时间:2015-10-18 00:51:27

标签: c++ qt static

我在Qt中创建一个C ++应用程序,并且每当我调用相应的ui-class的构造函数时都想加载一个登录键盘(QWidget)。每次切换到我的登录窗口时都会调用构造函数。当我离开这个窗口时,析构函数被调用,一切都被破坏了,所以我不会在RAM中留下一点。我还想要一个实例键盘(单例)然后在需要时隐藏()和show()。

当我第一次调用构造函数时,我创建了一个键盘实例并将其添加到我的verticalLayout中。这很好用。但是当我第二次调用构造函数时,例如当我切换到另一个窗口并切换回我的登录窗口时,我的静态键盘变得无法访问。这就是我的调试器所说的......它无法访问。所以我已经有了键盘的一个实例,我只是想再次将它添加到我的verticalLayout中,我不知道为什么我无法访问它。也许这是静态变量的一些属性,我真的不喜欢,因为我是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;
}

1 个答案:

答案 0 :(得分:1)

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

请参阅here

  

注意:项目的所有权转移到布局,布局的责任是删除它。

所以拥有QWidget的单例子类并不是一个好主意。如果确实需要单例属性 - 您可以将必要的功能提取到另一个类(不会是QWidget的子类)并从LoginKeyboard使用它。但是,如果你不真的需要它 - 那么就不要这样做 - 应该尽可能避免单身人士,因为他们只是全球变量的美化版本,可能会导致各种难以追踪的错误。