在类实例之间共享变量

时间:2012-07-19 08:06:45

标签: c++ design-patterns visual-c++ mfc

class MyApp : public CWinApp {
        afx_msg OnPrefrences();
    };

当用户选择工具时,会调用OnPrefrences() - >来自菜单栏的偏好。

现在在一个对话框(Say DlgX)中有一个按钮,点击此按钮我需要打开Preference对话框,其中实际上有很多窗格,但在这里我需要打开Preference对话框,选择一个这些窗格为活动。同样在那个特定的窗格中,我需要隐藏一些控件,只有当它通过这个对话框而不是通过菜单打开时。

所以我在MainFrm类中创建了一个变量(Say m_varX)。

void DlgX::OnButtonXClick()
{
   CMainFrame* pFrame = (CMainFrame*)AfxGetMainWnd();
   if(pFrame)
   {
       pFrame->m_varX = TRUE;
      ((CMyApp*)(AfxGetApp()))->OnPrefrences();
      pFrame->m_varX = FALSE;
   }
}

在DlgX的按钮处理程序中,我将m_varX设为TRUE并调用OnPreference(),关闭此首选项对话框后,我将m_varX设为FALSE。

这一切都很好......但问题是mainFrm中的东西变得杂乱无章。我正在研究的项目也是遗产项目,所以我无法做出太多改变。

有没有可用于处理此类案件的模式?

谢谢

2 个答案:

答案 0 :(得分:1)

我认为对于这种特殊情况,即使有时不再将其视为一种模式,singleton pattern也适合你。

答案 1 :(得分:1)

您可以使用自定义对话框解决此问题(如果您还没有)

当您从主菜单显示对话框,即onPreferences()时,您将填写并显示所有'窗格'。你必须做一个自定义对话框,其中ctor采取一些参数

e.g。

enum { all, part };

void MainFrame::OnPreferences() 
{
  CMyPreferences dlg( GetDocument(), all );
  dlg.DoModal();
}

但是当您从对话框中调用它时,您只需填写所需的部分。

void YourDialog::OnPreferences()
{
  CMyPreferences dlg( GetDocument(), part );
  dlg.doModal();
}

对于要显示/允许编辑的内容的更精细配置,该参数可能更复杂。