• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:「ファイルを保存するコモンダイアログ」と「クラス」)

ファイル保存コモンダイアログとクラス

このQ&Aのポイント
  • C++を勉強中で、APIを使ってファイル保存コモンダイアログを表示していますが、保存関数の中で`static`が必要な理由と、`static`を使わずにダイアログを動かす方法についてご教示ください。
  • ファイル保存コモンダイアログのためのクラス`FNameDlg`を作成し、その派生クラス`WaveSave`を使ってwavファイルを保存しています。`SaveMain`関数内でファイル保存ダイアログを開くために`ofnSet`関数を使用し、`SaveFile`関数でダイアログを実行しています。しかし、`SaveFile`関数に`static`を付けないと、ダイアログが返されてしまいます。なぜ`static`が必要なのか説明してください。
  • 静的メンバ関数`SaveFile`の中でダイアログを作成し、実行しています。`static`を付けると、関数内で作成したダイアログがずっと保持されてしまいます。どうすれば、ダイアログを開いた後に破棄することができるのでしょうか?また、`SaveFile`関数に`static`を付けた場合と付けなかった場合の違いについても教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
noname#164673
noname#164673
回答No.1

肝心のSaveFileの中身が無いので、ハッキリとは言えませんが、変数の初期化が絡んでいる様な気がします。 プログラムを拝見すると、FNameDlgのメンバ変数の初期化コードがありません。 通常は、FNameDlgのコンストラクタで初期化するのですが、コンストラクタが省略されているようです。 staticでクラスを宣言すると、静的領域にインスタンスが生成されます。 静的領域は、プログラム起動時にnullで初期化されるのが普通です。 一方、auto変数としてインスタンスを構築すると、スタック領域にインスタンスが配置されます。 スタック領域は、他の関数や割り込み処理が上書きしては戻すので、グチャグチャな状態です。 つまり何が書かれているか分からない初期化が必要な領域です。 static を記述した場合は、キレイなメモリ状態から動作し、static 無しつまりauto変数の場合は、グチャグチャなメモリ状態からプログラムが起動します。 それが原因では無いでしょうか? 解決策は、FNameDlgのコンストラクタでメンバ変数を初期化する事だと思います。 割愛されたプログラムを拝見した、想像した回答です。 間違っているかもしれませんので、ご注意下さい。

necozuki25
質問者

お礼

回答ありがとうございます。 確かに、コンストラクターで初期化を行うことで、static宣言なしでダイアログが表示されました。 >staticでクラスを宣言すると、静的領域にインスタンスが生成されます。 >静的領域は、プログラム起動時にnullで初期化されるのが普通です。 なるほど、静的領域はNULLで初期化されるのですね。だから、staticで宣言しないときは初期化が必要で、ダイアログが動かなかったと!! 大変勉強になりました。ありがとうございました。

関連するQ&A