- ベストアンサー
VC++ MFC エラーコード C2248 private メンバ (クラス 'CObject'で…
- VC++ MFC エラーコード C2248 private メンバ (クラス 'CObject'でエラーが発生しています。エラーの原因は、CComboBox cfdn = cad.m_combo; の部分で、プライベートメンバにアクセスしようとしているためです。このエラーの解消方法については、解説されている資料やフォーラムを参考にすることをおすすめします。
- ダイアログAにあるコンボボックスに単語を登録、削除する処理をしています。[登録]ボタン押下時には、入力された語句が既に登録済みかどうかを調べ、既に登録済みの場合は上書きするかどうかの確認ダイアログを表示します。そして、上書きする場合はダイアログBを表示し、語句を入力するエディットボックスがあります。ダイアログBで入力された語句が既に登録済みかどうかを調べ、既に登録済みの場合は上書きするかどうかの確認ダイアログを表示します。
- エラーメッセージ「CObject::CObject」が私メンバにアクセスできないというエラーが発生しています。このエラーの原因は、CComboBox cfdn = cad.m_combo; の部分で、プライベートメンバにアクセスしようとしているためです。解消方法としては、他の方法でコンボボックスの情報にアクセスするように修正することが必要です。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは。補足頂きました。 大変、すんません、CBDlgクラスのコンストラクタ内でCDialog(CBDlg::IDD, pADlg)を呼び出していませんでした。 CBDlgのソースファイルで、 ///////////////////////////////////////////////////////////////////////////// // CBDlg ダイアログ CBDlg::CBDlg(CADlg* pADlg) : CDialog(CBDlg::IDD, pADlg), m_pADlg(pDlg) { //{{AFX_DATA_INIT(CBDlg) // メモ - ClassWizard はこの位置にマッピング用のマクロを追加または削除します。 //}}AFX_DATA_INIT } の様にして、DoModal()で動作しませんか。 「Debug Libraly」のメッセージボックスが表示されるのは、此れが原因でした(当方の方でも確認)。
その他の回答 (3)
- machongola
- ベストアンサー率60% (434/720)
こんにちは。補足頂きました。 CBDlg* pBDlg = new CBDlg(this); pBDlg->Create(CBDlg::IDD, this); pBDlg->ShowWindow(SW_SHOW); 又は、モーダル(ダイアログBが閉じられるまで他のウィンドウのボタンなどを操作出来なくする)したいのなら、 CBDlg BDlg(this); BDlg.DoModal(); で開きませんか。
補足
CBDlg BDlg(this); BDlg.DoModal(); の方で処理をしたいのですがこれだと「Debug Libraly」のメッセージボックスが表示されてしまいます。 前者の方では正常に動いていますが…
- machongola
- ベストアンサー率60% (434/720)
こんにちは。補足頂きました。 >>ASSERT(::IsWindow(m_hWnd)); // ここ ダイアログAのウィンドウハンドルが不正か、存在しないか(既に消されてしまっているか)だと思います。 しかし、m_pADlgのポインタが不正であった場合も結果として、此の現象が発生します。 と言う事で、m_pADlgにダイアログAのポインタをしっかりと代入しているかどうか? と言う事だと思います。 CBDlgのヘッダーファイルで、 class CBDlg { //コンストラクタでダイアログAのポインタを引き取る explicit CBDlg(CADlg* pADlg = NULL); //遅延通知用 void SetDialogA(CADlg* pADlg); //省略 CADlg* m_pADlg; }; CBDlgのソースファイルで、 //コンストラクタ //////////////////////////////////////////////// CBDlg::CBDlg(CADlg* pADlg) : m_pADlg(pADlg)//←ココでダイアログAのポインタを引き取る { } //新規追加 void CBDlg::SetDialogA(CADlg* pADlg) { m_pADlg = pADlg; } CADlgのソースファイル中でCBDlgを開く場所で CBDlg pBDlg = new CBDlg(this); または、 CBDlg pBDlg = new CBDlg(); pBDlg->SetDialogA(this); とすれば良いと思います。 何れにも当てはまらない場合には、CBDlgを開いている周辺のコードを見せて頂かないと分かりません・・・。
お礼
お礼が遅れ申し訳ございません。 CBDlg pBDlg = new CBDlg(); pBDlg->SetDialogA(this); の方でコンパイルは通りますが、 CBDlg pBDlg = new CBDlg(); pBDlg->SetDialogA(this); の処理のあとに CBDlg dlg; dlg.DoModal(); の処理は追加する必要があるのでしょうか? 初心者ゆえの質問になってしまいますがよろしくお願いいたします。
補足
お礼への補足とさせてください。 CBDlg pBDlg = new CBDlg(); pBDlg->SetDialogA(this); でBダイアログは生成されるのだろうと思い この処理のみで実行してみましたが Bダイアログは開かれませんでした。 そこで CBDlg dlg; dlg.DoModal(); をした場合、 「Debug Libraly」のメッセージボックスが表示されて上手い具合にいきません。 改善策を教えていただければと思います。
- machongola
- ベストアンサー率60% (434/720)
こんにちは。 CComboBox cfdn = cad.m_combo; cad.m_comboはprivateメンバである為、外部から触る事が出来ません。コンパイラは其れを通知しているのではないでしょうか。 CADlgのヘッダファイルにあるclass CADlgの中に class CBDlg; class CADlg { friend class CBDlg; //省略 }; と書けばコンパイルに通す事だけは出来ます。ただし、根本的な解決には成らないと思います。 その理由なのですが、 CADlg cad; CComboBox cfdn = cad.m_combo; と有りますが、此れではCADlgを此の場所で一時的に作成する事に成ってしまいます。 本当に手元に欲しいのは、向こうで開かれているCADlgそのものです。 ですので、以下の様な感じにならないと、処理が意図した通りに達成出来なくなります。 if(!m_pADlg) { ;//error return; } CComboBox* pComboBox = static_cast<CComboBox*>(m_pADlg->GetDlgItem(IDC_COMBO1)); if(!pComboBox) { ;//error return; } //ココで漸くダイアログAのコンボボックスが取れた事になる cnt = pComboBox->GetCount(); こうする為に、class CBDlgの中に CADlg* m_pADlg; を追加して、CBDlgを開く時に、CADlg側からポインタを送り届けないと、CBDlg側からCADlgを操作する手段がない事に成ってしまいます。 ダイアログAとダイアログBの関係と言う、此の手の質問は結構上がるのですが、 http://oshiete1.goo.ne.jp/qa4316216.html 辺りが其れに近いと思います。
お礼
回答いただきありがとうございます。 下方にある処理で試したところエラーは解消されましたが、 実行後、Bダイアログでも同じ名前を入力したところ >CComboBox* pComboBox = static_cast<CComboBox*>(c1tirf03->GetDlgItem(IDC_MAIN_FILMDEV_NAME)); の部分でアクセス違反が発生してしまいます。 エラー文をクリックすると以下のところに飛びます。 #include "winocc.cpp" CWnd* CWnd::GetDlgItem(int nID) const { ASSERT(::IsWindow(m_hWnd)); // ここ if (m_pCtrlCont == NULL) return CWnd::FromHandle(::GetDlgItem(m_hWnd, nID)); else return m_pCtrlCont->GetDlgItem(nID); } これは何故なのでしょうか? 初心者で解消法がわからないためお手数ですがご回答の程よろしくお願いいたします。
補足
例外が発生してしまう場所は >CComboBox* pComboBox = static_cast<CComboBox*>(m_pADlg->GetDlgItem(IDC_COMBO1)); でした。 ペーストミスです、すみません。
お礼
ご回答いただきありがとうございます。 この処理で無事解決することができました。 BAはこの最後の回答にさせていただきたく思います。 ありがとうございました!