すいません、またすこしわからなくなってしまったのでもう一つだけお聞きしたいのですが、
今、CDocumentから派生したCTestDocクラスと、どこからも派生してないCAクラスの二つがあったとします。そして、
その二つのクラスが次のようになってたとします。
TestDoc.hの中身 A.hの中身
#includeA.h //#includeTestDoc.hにすると2重定義に
//なってしまうからインクルードできないはず
class CTestDoc : CDocument class CA
{ {
//メンバ関数 //アクセス関数
void MKansu() int GetAbc();
void SetAbc(int v);
・ ・
・ ・
//メンバ変数 //メンバ変数
private private
CA m_a; int m_abc;
int m_test;
・ ・
・ ・
} }
CTestDocクラスでCAクラスのオブジェクトをメンバ変数として宣言している場合です。
ここで、もし、「CTestDocクラス」のメンバ関数MKansu()の実装の中で、CTestDocのメンバ変数m_testの値をCAクラ
スのメンバ変数m_abcに入れたいとしたらどうするのでしょうか。やっぱり、
m_a.SetAbc(m_test);
でしょうか。
> CTestDocクラスでCAクラスのオブジェクトをメンバ変数として宣言している場合です。
> ここで、もし、「CTestDocクラス」のメンバ関数MKansu()の実装の中で、CTestDocのメンバ変数m_testの値をCAクラ
> スのメンバ変数m_abcに入れたいとしたらどうするのでしょうか。やっぱり、
>
> m_a.SetAbc(m_test);
>
> でしょうか。
動作としてはそれで良いはずです。
Set??関数等を用いる場合には、はまちさんが良いと思われる方法で統一して置けば問題はないと思います。
クラスの実体をメンバ変数に持つ場合には事前にヘッダファイルの include が必要ですが、
ポインタをメンバに持つ場合は必ずしもヘッダを include する必要はないです。
// a.h
#ifndef _A_H_
#define _A_H_
class CB; // これが必要
class CA
{
private:
CB *m_pB; // ポインタなので OK
};
#endif
という風にすれば a.h で b.h を include しなくても CB へのポインタをメンバに持つことが出来ます。
後は a.cpp のほうで b.h を include しておけばいいです。
重さん、それから、kazumaさん、お返事ありがとうございました。kazumaさんが言われたのは、重さんが言ってた
マクロのことと同じなのでしょうか。重さんが、書いてくれたマクロの例にとてもよく似ていたのでそんな気が
しました。マクロの2重定義回避の方法はまだ調べているところなのでわからないところだらけなのですが、
重さんの方法も、kazumaさんの方法も、意外に簡単そうなのでびっくりしました。はじめ重さんが、「書籍では
見かけない」とおっしゃっていたので、とても難しいことに踏み込んでしまったのかとしり込みしてたのですが、
私にもできなくもないような気がしてきました。早速、試してみます。