- 締切済み
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; されてしまい困っています。 わかりにくい説明かと思いますが、説明不足であれば補足要求をお願いいたします。 ご教授いただきたく思います。
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- redfox63
- ベストアンサー率71% (1325/1856)
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; } といった具合でしょう
staticもグローバル変数も= 0で初期化されるのは初回のみです
- titokani
- ベストアンサー率19% (341/1726)
この場合、iをCBDlgクラスのstaticメンバ変数にするのがよいかと。 #変数名はもうちょっと長いのに変えたほうがいいでしょうが。
- Tacosan
- ベストアンサー率23% (3656/15482)
「変数を1度使ったらなくなるようにしたいです。」は正直なところ意味不明なんだけど, 単に「関数の呼び出しを超えて値を保存したい」というなら静的な変数にすればいい. 1つの関数の中で使うだけなら static, 複数の関数で使いたいならファイルレベルで定義する.
お礼
回答ありがとうございます。 説明不足で申し訳ございません。 >「変数を1度使ったらなくなるようにしたいです。」 つまりは関数内で i = 0; がされますが、 2回目以降はこのi = 0をしないようにしたいということです。