【问题标题】:Keeping objects after the termination of method in c++在 C++ 中的方法终止后保留对象
【发布时间】:2015-09-14 09:57:52
【问题描述】:

我有一个非常基本的问题。我正在使用 MFC 构建用户界面。在我的一个 buttonClicks 方法中,我创建了一个临时对象 (folderDlg),并且我希望在其他 buttonClicks 中恢复该对象(有点像在 matlab gui 中保存句柄)。 目前我在我的 dlg 类 (GUI_FORM) 中创建了一个成员对象 (pathFolder) 并将其引用设置为 temp 对象。很明显temp对象在buttonClick结束的时候就被破坏了,成员的引用也丢失了…… 保持创建的对象以供进一步使用的最简单方法是什么?

相关代码部分:

class GUI_FORM : public CDialog
{
public:
    GUI_FORM(CWnd* pParent = NULL) : CDialog(GUI_FORM::IDD, pParent) // wizard code
    {    }

    CFolderPickerDialog * pathFolder;

public:
    DECLARE_MESSAGE_MAP() 
    afx_msg void OnBnClickSaveAs();
        ...
    }

void GUI_FORM::OnBnClickSaveAs()

{

    CFolderPickerDialog folderDlg;
    if (folderDlg.DoModal() == IDOK)
        AfxMessageBox(folderDlg.GetFolderPath());
    GUI_FORM::pathFolder = &folderDlg;
}

【问题讨论】:

  • 也许只是让它成为一个完整的成员变量CFolderPickerDialog pathFolder;,而不仅仅是一个指针。
  • 为什么要复用它?出于效率原因?我建议你避免这种情况;你所做的已经是正确的事 (TM)
  • 您是否考虑过学习编程语言,而不是询问最小、最基本的问题?请参阅The Definitive C++ Book Guide and List,并至少选择一个。

标签: c++ mfc pass-by-reference


【解决方案1】:
std::unique_ptr<CFolderPickerDialog> folderDlg(new CFolderPickerDialog);
Assert(folderDlg);
if (folderDlg->DoModal() == IDOK)
    AfxMessageBox(folderDlg->GetFolderPath());
GUI_FORM::pathFolder = std::move(folderDlg);

那么,在GUI_FORM的定义中:

class GUI_FORM : public CDialog {
public:
  // ...
  std::unique_ptr<CFolderPickerDialog> pathFolder;

要访问对话框的底层指针,请执行pathFolder.get()

在 C++ 中,您必须担心数据的生命周期。这会创建数据,其生命周期在唯一持有它的 unique_ptr 被销毁时结束。

要移动它,请使用std::move

【讨论】:

    【解决方案2】:

    保持创建的对象以供进一步使用的最简单方法是什么?

    改变这一行:

    CFolderPickerDialog folderDlg;
    

    到这里:

    CFolderPickerDialog& folderDlg = *(new CFolderPickerDialog());
    

    这是否是一个好主意,这是一个更复杂的问题。但这是对您所提问题的简单直接回答。

    【讨论】:

    • “把一只脚放在另一只脚前面”是对“我如何攀登珠穆朗玛峰?”的回答,但我不会称之为回答. ;)
    • @Yakk 无论从字面上还是比喻上,您都将珠穆朗玛峰带入了讨论。 OP没有。也许 OP 应该问,“什么是一种强大的可扩展方法来保留对象以供进一步使用”。但这不是问的问题,所以这不是我回答的问题。最简单的方法是稍后担心内存泄漏(或永远不会,因为该示例暗示内存泄漏将是微不足道的)。稳健的可扩展方法不太容易(可能更好,但仍然不太容易)。
    • 故意泄漏资源并不是解决任何问题的方法。不,认真的。即使你指出,你正在泄漏资源。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-26
    • 2015-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多