他のクラスのメンバ関数にアクセスするには

解決


VC初心者  2003-12-05 14:17:27  No: 52771  IP: [192.*.*.*]

VC++6.0  MFCを利用してFTPクライアントを作ろうと考えております。
CFormViewを基本クラスとしてAppWizardで初期設定をしました。

MainFrameクラスのOnConnectというメンバ関数の中から
ftpViewクラスのGetFile(引数)というメンバ関数を呼び出したいのですが
どうしたらいいのかわかりません。

void CMainFrame::OnConnect() 
{
〜〜省略〜〜
CFtpView::GetAllFiles(引数);
}
ではできませんでした。

またincludeすればよいのかと思い
CMainFrm.cppのなかでftpViewが.cppファイルなどをinclude
しようとしましたが。同じくエラーがでてできませんでした。

メンバ関数はすべてpublicで宣言してあるのですが
どなたかわかる方ご指導よろしくお願いします

編集 削除
tetrapod  2003-12-05 15:35:20  No: 52772  IP: [192.*.*.*]

えー、たぶん C++ の基礎を勉強されるほうが解決が早いと思われます。
説明しても理解してもらえないような気が...

編集 削除
なーめ  2003-12-05 18:50:10  No: 52773  IP: [192.*.*.*]

>> えー、たぶん 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()
{
 ....
}
#これについては、何が悪いの?などという質問は却下です。
#パワープログラミングとか言ってたかな。
#たしかにバワー消耗するわなー。

編集 削除
VC初心者  2003-12-05 19:53:21  No: 52774  IP: [192.*.*.*]

tetrapod様、なーめ様
すばやいご回答、ご指摘本当にありがとうございます。
実際にやってみたところとても簡単にできました。

ご指摘どおりC++の知識が足りないとゆうことを痛感いたしましたので
このツールを作成し次第C++に戻り基礎から学びなおしたいと思います。
ありがとうございました。

編集 削除