使用指针和类在MFC中创建无模式窗口之间的区别

时间:2012-09-08 07:34:50

标签: c++ mfc

这个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()足够吗?

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

1 个答案:

答案 0 :(得分:1)

这是一个棘手的问题,因为很多问题取决于您正在尝试做什么,以及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,那么你别无选择,只能使用指针版本。