• 締切済み

c++ 変数を1度使ったら削除する等

変数を1度使ったらなくなるようにしたいです。 今、MFCでダイアログを作成しているのですが AとBのダイアログがあります。 AのOnBnButtonClicked()内で CBDlg dlg; dlg.DoModal(); と作成し、ボタンが押されるとBのダイアログが呼び出されるようにしました。 Bにはエディットボックスがあり、 呼び出されたB内でエディットボックス内を変更します。 最初(1回目)に呼び出した場合にはエディットボックス内に0と表示させておきたいです。 Bを閉じて、もう一度ボタン押下でBを呼び出しても先ほど変更した内容が表示されている、というようにしたいです。 そのためにif文で if(Bが初めて呼び出されたとき){ エディットボックスに0を表示; } else if(2回目以降){     先ほど編集したデータ; } というようにしようと自分の中では考えています。 Bのダイアログが初めて呼び出されたときを0として int i = 0; if(i == 0)...... として それ以降1回呼び出されるごとにiを +1していきたいです。 そうするために int i = 0; を初期化で設定する必要があるのですが そう設定するとBのダイアログが呼び出されるたびに i = 0; されてしまい困っています。 わかりにくい説明かと思いますが、説明不足であれば補足要求をお願いいたします。 ご教授いただきたく思います。

みんなの回答

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.4

CBDlgのオブジェクトローカル変数で持つのであれば コンストラクターなどで初期値を与えるようにします --- BDLG.H class CBDlg : public CDialog { public:   CBDlg(CWnd* pParent = NULL, int* pIntialN = NULL );   int getEditInt(); private:   // これをテキストボックスの変数に割り当てる   int m_nEdit1; }; --- BDlg.cpp CBDlg::CBDlg( CWnd* pParent /*=NULL*/, int* pInitalN /*= NULL */ ) : CDialog( CBDlg::IDD, pParent ) {   if ( pIntialN != NULL ) {     m_nEdit1 = *pIntialN;   } } int CBDlg::GetEditInt() {   return m_nEdit1; } --- 呼び出し元でBdlgのテキストボックスの数値を管理 CBdlg dlg( this, &m_nNumber ); dlg.DoModal(); m_nNumber = dlg.GetEditInt(); 別の方法としては CBDlgのポインタ変数を呼び出し元でメンバー変数として持つ CBDlgのメンバー変数のm_nEditをCBDlgのコンストラクタで初期化 といった方法でしょう --- BDLG.H class CBDlg : public CDialog { public:   CBDlg(CWnd* pParent = NULL ); private:   // これをテキストボックスの変数に割り当てる   int m_nEdit1; }; --- BDlg.cpp CBDlg::CBDlg( CWnd* pParent /*=NULL*/, int* pInitalN /*= NULL */ ) : CDialog( CBDlg::IDD, pParent ), m_nEdit1(0) { } --- 呼び出し元ヘッダー #include "BDLG.h" クラス定義内に CBdlg m_pDlg; と記述 ----呼び出し元CPP コンストラクタでm_pDlgを初期化 CMainFrame::CMainFrame(), m_pDlg( NULL ) { } CBDlgの呼び出しのとき void CMainFrame::OnTest() {   if ( m_pDlg == NULL ) {     m_pDlg = new CBdlg();   }   m_pDlg->DoModal(); } デストラクタまたはWM_DESTROYなどで if ( m_pDlg != NULL ) {   delete m_pDlg; } といった具合でしょう

noname#208124
noname#208124
回答No.3

staticもグローバル変数も= 0で初期化されるのは初回のみです

  • titokani
  • ベストアンサー率19% (341/1726)
回答No.2

この場合、iをCBDlgクラスのstaticメンバ変数にするのがよいかと。 #変数名はもうちょっと長いのに変えたほうがいいでしょうが。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

「変数を1度使ったらなくなるようにしたいです。」は正直なところ意味不明なんだけど, 単に「関数の呼び出しを超えて値を保存したい」というなら静的な変数にすればいい. 1つの関数の中で使うだけなら static, 複数の関数で使いたいならファイルレベルで定義する.

doborn
質問者

お礼

回答ありがとうございます。 説明不足で申し訳ございません。 >「変数を1度使ったらなくなるようにしたいです。」 つまりは関数内で i = 0; がされますが、 2回目以降はこのi = 0をしないようにしたいということです。