gpt4 book ai didi

c++ - 在 MFC 中使用指针和类创建无模式窗口的区别

转载 作者:行者123 更新时间:2023-11-28 07:57:42 28 4
gpt4 key购买 nike

resource描述了一种使用指针创建无模式对话框的方法。他们创建一个指向对话框类的指针,然后使用 -> 语法。

CModeLess *m_pmodeless = new CModeLess(this);
m_pmodeless->Create(CModeLess::IDD);
m_pmodeless->ShowWindow(SW_SHOW);

到目前为止,我一直在做这样的事情:

CModeLess m_pmodeless;
m_pmodeless.Create(IDD_DIALOG);
m_pmodeless.ShowWindow(SW_SHOW);

我这样做主要是因为我觉得使用类很舒服。使用这种方法有什么缺点吗?

其次,在指针方法中我必须做这样的事情来关闭窗口:(如果我没记错的话)

if(m_pmodeless != NULL) { delete m_pmodeless; }

如果我使用类或者 m_pmodeless.closeWindow() 是否足够,我必须做一些删除吗?

如果这是一个非常基本的问题,我深表歉意,但我很想知道。

最佳答案

这是一个很难回答的问题,因为很大程度上取决于您要尝试做什么以及 CModeless 的具体实现方式。一般来说,避免使用指针是正确的,但是 GUI 编程有一些特殊问题,因为程序中的 C++ 对象代表屏幕上的 GUI 对象,协调程序中 C++ 对象的销毁与屏幕上的 GUI 对象可能相当棘手的。有时指针是解决此问题的最简单方法。

我假设 m_pmodeless 是另一个类的成员变量。

一个问题是对象的生命周期。在类版本中,CModeless 对象将在包含对象被销毁时被销毁。这是否适合您取决于您​​的代码。这是否也会破坏无模式对话框取决于 CModeless 的实现方式。如果可以,您需要查看 CModeless 析构函数,如果不能,则需要查看 CModeless 的文档。使用指针版本,您可以明确控制对象何时被销毁,只需在正确的时间调用 delete 即可。

另一个问题是一些 GUI 库会在 GUI 对象被销毁时自动删除 C++ 对象。像这样(在 Windows 上)

case WM_NCDESTROY:
...
// last message received so delete the object
delete this;
break;

像这样的代码假设您的所有对象都是堆分配的,并会在正确的时间自动为您删除它们。如果 CModeless 是这样写的,那么你别无选择,只能使用指针版本。

关于c++ - 在 MFC 中使用指针和类创建无模式窗口的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12328949/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com