掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
他のクラスのメンバ関数にアクセスするには (ID:52773)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
>> えー、たぶん C++ の基礎を勉強 (^^;; ... 同意。 でも、敢えて... ほかのクラスのメンバにアクセスするには、 そのクラスの「定義」をインクルードします。 #inlcude "FtpView.h" >> メンバ関数はすべてpublicで宣言 これだけでは使えません。 CFtpView * pFtpView; が必要です。 ポインタに値をいれずにいきなり、 pFtpView->GetAllFiles(); をしないでくださいね。 まあ、ビューが1つということで、SDI なら CMainFrm::GetActiveView() かな。 ビューがいっぱいあると、どのビューが得られたかわからないよね。 #もっと根本的なことを指摘すべきかもしれませんが... #とりあえずコンパイル/リンクくらいは通してみたいですよね。 というわけで、やってみましょう。 SDI でプロジェクト(S01)作成。 メニューに IDM_CONNECT "コネクトした" を追加。 (命名規則違反という指摘があるかも) コマンドハンドラを追加して、 CMainFrm::OnConnect() ができる。 さらに、 CS01View::GetAllFiles(); を追加。 BOOL CS01View::GetAllFiles() { // これだけ。 TRACE("CS01View::GetAllFiles();が呼ばれた!\n"); return( FALSE ); } #include "S01View.h" void CMainFrame::OnConnect() { CS01View * pS01View; } これでコンパイルすると、 構文エラー : ';' が '*' の前に必要です。 CS01Doc' : 識別名を宣言するのに、型が指定されていません なので、 #include "S01Doc.h" を追加。 warning C4101: 'pS01View' : ローカル変数は 1 度も使われません。 とりあえずコンパイルは通った。できたプログラムも立ち上がる。 次に // こんな場所にインクルードするなといわれますが。 #include "S01Doc.h" #include "S01View.h" void CMainFrame::OnConnect() { CS01View * pS01View = (CS01View *)GetActiveView(); if( pS01View ) { pS01View->GetAllFiles(); } else { TRACE("ビューが取れない\n"); } } これでもコンパイルがとおる。 プログラムを起動して、[コネクトした]を選択。 デバッグウィンドウに、 CS01View::GetAllFiles();が呼ばれた! ちゃんと呼ばれるようだ。 いかがかな。 ----------------蛇足---------------- >> CMainFrm.cppのなかでftpViewが.cppファイルなどをinclude 普通はインプリメンテーションファイルをインクルードしませんよ。 データテーブルの配列を(データを読み込む代わりに)インクルードすることは たまにありますが、あくまでテスト用、ワンタイム使用ですね。 .h の書き間違い? でも、ソースの頻繁に使う部分をインクルードファイル(名前:*.cpp)にして 複数のプロジェクトで流用する方法を示している書籍があったなー。 たしかに、著者には便利なのかもしれないが。 困るよなー、そんなやり方ひろめられちゃ。 次のようなやりかたです。 ------<XXXDlg.h>-------- #define INCCLSNAME CXXXDlg #include "oninitdialog.cpp" #include "ondraw.cpp" .... ------<oninitdialog.cpp>--- INCCLSNAME::OnInitDialog() { .... } #これについては、何が悪いの?などという質問は却下です。 #パワープログラミングとか言ってたかな。 #たしかにバワー消耗するわなー。
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.