0

このリソースでは、ポインタを使用してモードレスダイアログを作成する方法について説明します。ダイアログクラスを指すポインタを作成し、->構文を使用します。

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()クラスを使用する場合、または十分な場合、削除する必要がありますか?

これが非常に基本的な質問である場合はお詫び申し上げますが、知りたいと思います。

4

1 に答える 1

1

これは答えるのが難しい質問です。多くの場合、実行しようとしていることと、CModelessの実装方法に大きく依存するためです。一般に、ポインタを避けるのは正しいですが、プログラム内のC ++オブジェクトは画面上のGUIオブジェクトを表すため、GUIプログラミングには特別な問題があり、プログラム内のC++オブジェクトの破棄を画面上のGUIオブジェクトと調整することは非常に困難です。トリッキー。この問題に対する最も簡単な答えは、ポインタである場合があります。

m_pmodelessは別のクラスのメンバー変数であると想定しています。

1つの問題は、オブジェクトの存続期間です。クラスバージョンでは、含まれているオブジェクトが破棄されると、CModelessオブジェクトが破棄されます。それで問題ないかどうかは、コードによって異なります。それがモードレスダイアログも破壊するかどうかは、CModelessがどのように実装されているかによって異なります。可能であればCModelessデストラクタを参照する必要があり、不可能な場合はCModelessのドキュメントを参照する必要があります。ポインタバージョンを使用すると、オブジェクトが破棄されるタイミングを明示的に制御できます。適切なタイミングでdeleteを呼び出すだけです。

もう1つの問題は、GUIオブジェクトが破棄されると、一部のGUIライブラリがC++オブジェクトを自動的に削除することです。このようなもの(Windowsの場合)

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

このようなコードは、すべてのオブジェクトがヒープに割り当てられていることを前提としており、適切なタイミングでそれらを自動的に削除します。CModelessがこのように記述されている場合は、ポインターバージョンを使用する以外に選択肢はありません。

于 2012-09-08T08:39:48.030 に答える