ドキュメントクラスへのポインタの使い方

[戻る]
はまち 2002/05/10(金) 06:35:54
////////////////////////////////////////////////////////////////////////////////
    
    開発環境 : Visual C++ 6.0 Service Pack 3
    動作環境 : Windows 98 Second Edition
    MFC使用 MDIベース

////////////////////////////////////////////////////////////////////////////////

CDocumentの派生クラスCXXXDocクラスへのポインタは、CXXXDocクラスと関係のあるクラス
ではとてもよく使うと思います。ViewクラスなどだったらGetDocumentなどで取得できる
と思うのですが、他の自作クラス内ではどのように取得して使うのでしょうか。
 私が思いついたものだと、

〔1〕その自作クラス内でメンバ変数m_pDocのように宣言しておき、コンストラクタ時に
メンバイニシャライザのようにして代入して、他の関数内ではいつもこのm_pDocを使う

〔2〕その自作クラス内でメンバ変数m_pDocのように宣言しておき、AfxGetAppからたどって
いって代入して、他の関数内ではいつもこのm_pDocを使う

〔3〕その自作クラス内でstaticでメンバ変数m_pDocのように宣言しておき、CXXXDocクラスの
InitDocument()などで外部から代入して、他の関数内ではいつもこのm_pDocを使う

です。今は〔3〕を主に使っているのですが、少し問題が出てきました。みなさんは
どうやっていますか。
 どんなことでも結構です。何かお気づきな点などがあれば教えてください。よろしくおねが
いします。

くたくた 2002/05/10(金) 11:47:56
私は[2]を使います。但しメンバ変数にはしません。
速度を気にする必要がない部分で使う為です。

又、「ドキュメントにいつでも触りたい」事はよくある為、
"CDocument* GetDoc( void )"という関数にし、ライブラリ化しています。

で、CDocument*を CXXXDoc* へ型変換して 使うって感じです。

はまち 2002/05/11(土) 18:04:25
[[解決]]
こんにちは、くたくたさん。先日は大変失礼しました。

お返事ありがとうございました。AfxGetAppを使っているんですね。私はAfxGetAppを使う
といつも5・6行使ってしまい、コードの大部分を占めてしまうようで敬遠していたのですが、
GetDoc( void )のようにすれば確かに、好きなときにいつでも呼び出せてとても便利そうです
ね。気づきませんでした。
 私は[3]を使っていたのですが、すこし問題が出てきました。MDIでプログラムを作って
いるのですが、「新規作成」や「開く」で新しいドキュメントを作ると、m_pDocをstaticで
宣言しているためか、同じクラスでm_pDocを共有してしまい、古い方のドキュメントをささ
なくなってしまっているようです。

自作クラス
m_pDoc----------->もともとのCXXXDoc
m_pDoc----------->新規作成のCXXXDoc

としたいのですが、

自作クラス
m_pDoc-----V      もともとのCXXXDoc
m_pDoc----------->新規作成のCXXXDoc

となっているみたいです。
MDIでドキュメントを動的に作るときは、みなさんはどうやってCXXXDocへのアクセスを管理
しているのかと思っていたのですが、くたくたさんの方法でもできないのかと今検討している
ところです。GetFirstDocPosition()とGetNextDoc()で「3番目に新規作成したドキュメン
ト」などをうまくアクセスできないかと思っているのですが、もうすこしやってみようと
思います。ありがとうございました。

古いスレッドには追加発言できません。