Разница между использованием указателя и класса для создания немодального окна в MFC

это ресурс описывает метод создания немодального диалога с использованием указателей. Они создают указатель, указывающий на класс диалога, а затем используют синтаксис ->.

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() довольно?

Я прошу прощения, если это очень простой вопрос, но мне интересно знать.

0

Решение

На этот вопрос сложно ответить, поскольку многое зависит от того, что именно вы пытаетесь сделать, а также от того, как реализован CModeless. В целом вы правы, избегая указателей, но у программирования с GUI есть особые проблемы, потому что объекты C ++ в вашей программе представляют объекты GUI на экране, и координация уничтожения объектов C ++ в вашей программе с объектами GUI на экране может быть довольно сложно. Иногда указатели являются самым простым ответом на эту проблему.

Я предполагаю, что m_pmodeless является переменной-членом другого класса.

Одна проблема — это время жизни объектов. В версии класса объект CModeless будет уничтожен при уничтожении содержащего его объекта. Будет ли это нормально для вас, зависит от вашего кода. Разрушает ли это также немодальный диалог, зависит от того, как реализован CModeless. Вам нужно взглянуть на деструктор CModeless, если вы можете, или документацию для CModeless, если вы не можете. С версией указателя у вас есть явный контроль, когда объект уничтожается, просто вызовите delete в нужное время.

Другая проблема заключается в том, что некоторые библиотеки GUI автоматически удаляют объект C ++, когда объект GUI уничтожается. Как то так (на винде)

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

Код, подобный этому, предполагает, что все ваши объекты выделены в куче, и автоматически удаляет их для вас в нужное время. Если CModeless написано так, то у вас нет выбора, кроме как использовать версию указателя.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]