C ++:对话框的单个实例?

问题描述 投票:0回答:1

我有一个对话框,我只想存在一次,因为两个不同的类(MainFrame可直接打开它,而Wizard可以使用向导本身带来的设置打开它)必须在任何给定的位置访问它时间。理想情况下,我希望用户能够使用向导打开对话框,并填写所有内容,然后将其关闭。如果他们需要更改设置,则应该可以使用MainFrame打开它并在那里进行编辑。

我实现它的方式当前有两个不同的对话框实例。如果在向导后从大型机中打开它,则大型机一将具有默认值,而向导一也可使用向导中的值来打开。

我尝试在this之后实现单例设计模式,但是尝试打开向导或对话框本身会导致它出现xC0000005错误。

MainFrame可以访问向导和对话框标题,而对话框可以访问向导标题,该函数的功能是将数据从向导传递到对话框(对话框在向导标题中预先声明)。

我真的不确定前进的方向,但是可以提供任何帮助。如果需要,我可以提供有关实现的代码。

编辑:在链接的URL之外没有做很多事情,但是如果有什么不同,可以在wxWidgets上进行开发。这里是相关代码。

Dialog.h

#include "Wizard.h"
class Dialog
{
private:
    Dialog() {}
    Dialog(Dialog const& copy) {}
    Dialog& operator=(Dialog const& copy) {}

    static Dialog* instance;

//many functions and variables

public:
    Dialog(wxWindow* parent) //more fields, generated by wxFormBuilder
    ~Dialog();

    Wizard* wizard;
    void SetRelative(Wizard* inWizard);

    static Dialog* GetInstance()
    {
        instance = new Dialog(NULL);
        return instance;
    }
};
Dialog.cpp

#include "Dialog.h"

Dialog* Dialog::instance = 0;

Dialog::Dialog(wxWindow parent, etc.)
{
    //lots of stuff
}

//event handlers, helper functions

void Dialog::SetRelative(Wizard* inWizard)
{
    this->Wizard = inWizard
}
Wizard.h

class Dialog;

class Wizard
{
public:
    Dialog* dialog;
}
Wizard.cpp

#include "WizardSetup.h"
#include "WizardDialog.h"

Wizard::Wizard(wxWindow* parent, etc.)
{
//bunch of stuff
    dialog->GetInstance()
    dialog->SetRelative(this) <--------- hangs at this statement
}
MainFrame.cpp

#include "Dialog.h"
#include "Wizard.h"

class MainFrame: public wxFrame
{
protected:
    Dialog* m_dialog;
    Wizard* m_wizard;

etc.
}
MainFrame.cpp
#include "MainFrame.h"

MainFrame::MainFrame(wxWindow* parent, etc.)
{
//stuff here

m_dialog->GetInstance();
}

void MainFrame::menuDialogOnMenuSelection( wxCommandEvent& event)
{
    m_dialog->Show(); <-------- hangs here
}
c++ singleton wxwidgets
1个回答
0
投票

此代码的三个(立即)问题:

  1. 您的Dialog::Dialog(WxWindow*)构造函数是公共的,它发送有关您单例对象的性质的混合信号。当您不直接负责崩溃或挂起时,您会将班级暴露于不当使用之下,这可能会违反单例合同(从而间接导致崩溃,死机,甚至更糟:无声错误),而下一个家伙(可能是月)尝试维护此代码。

  2. 您不检查Dialog函数中是否存在已实例化的Dialog::GetInstance()。您应该有

static Dialog* GetInstance()
{
    if (instance == nullptr) instance = new Dialog(nullptr);
    return instance;
}
  1. 您没有为单例Dialog*的地址分配各种Wizard::dialog成员变量(例如MainFrame::m_dialogDialog)。请务必这样做:
// (in the Wizard constructor for example)
dialog = Dialog::GetInstance();
© www.soinside.com 2019 - 2024. All rights reserved.