我有一个对话框,我只想存在一次,因为两个不同的类(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
}
此代码的三个(立即)问题:
您的Dialog::Dialog(WxWindow*)
构造函数是公共的,它发送有关您单例对象的性质的混合信号。当您不直接负责崩溃或挂起时,您会将班级暴露于不当使用之下,这可能会违反单例合同(从而间接导致崩溃,死机,甚至更糟:无声错误),而下一个家伙(可能是月)尝试维护此代码。
您不检查Dialog
函数中是否存在已实例化的Dialog::GetInstance()
。您应该有
static Dialog* GetInstance()
{
if (instance == nullptr) instance = new Dialog(nullptr);
return instance;
}
Dialog*
的地址分配各种Wizard::dialog
成员变量(例如MainFrame::m_dialog
和Dialog
)。请务必这样做:// (in the Wizard constructor for example)
dialog = Dialog::GetInstance();