- ベストアンサー
生成もとのクラスへのアクセス
clsB::vfFuncB関数ないで clsA::lVarAにアクセスする方法がありましたら 教えて下さい。 #include <stdio.h> class clsB{ public: clsB(){}; ~clsB(){}; void vfFuncB(){ printf("clsB::vfFuncB\n"); printf("clsA::lVarAをアクセスしたい\n"); }; }; class clsA{ public: clsA(){}; ~clsA(){}; void vfFuncA(void){ clsB oB; oB.vfFuncB(); }; void vfSet(long lA){lVarA=lA;} long lfGet(void) {return lVarA;} private: long lVarA; }; void main(void) { clsA oA; oA.vfFuncA(); }
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
>ゆえにclsAのコンストラクタを細工するのは避けたい。 clsBのコンストラクタですよね? >また、clsBがclsAの寿命中に常に常駐するのは避けたい。 vfFuncA()のメソッド中に clsBを宣言しているので、vfFuncAの実行時に clsBはスタックに実体がとられ、vfFuncA終了と共に解放されるので常にメモリをとられているわけではありません。 >がてるのです。何処が悪いの? clsBの構造を先に定義しないとだめなんじゃないでしょうか。 また、以下のコードは、 void vfFuncB(clsA* oB){ oB.vfSet(123); }; ポインタで渡されているから、oB->vfSet(123); ですね。
その他の回答 (4)
- a-kuma
- ベストアンサー率50% (1122/2211)
他の方と似たような回答になりますが、clsA と clsB の関係が、vfFuncA() を 呼ぶ間だけの、「疎」な関係に有るのであれば、clsA.vfFuncA() で、clsB.vfFuncB() を 呼ぶときに、自分( clsA のオブジェクト)を渡すようにする方が良いでしょう。 class clsB { … void vfFuncB(clsA* a); /* メソッドの定義は後で */ { printf("clsA::lVarA is %ld\n", a.lfGet()); } }; class clsA { … void vfFuncA(void) { clsB oB; oB.vfFuncB(this); } }; void clsB::vfFuncB(clsA* a) { printf("clsA::lVarA is %ld\n", a.lfGet()); } clsA と clsB の関係が「密」であるならば、yatokesa さんの回答にあるように コンストラクタで関連を持たせるようにする方が良いです。
vf が virtual function のような気がしたので、私は継承について少し。 class clsA { protected: long lVarA; public: virtual void vfFunc() { 「clsAの処理」; } }; class clsB : public clsA { // clsBはclsAの機能を拡張する public: void vfFunc() { clsA::vfFunc(); // まず、clsAとしての処理を行う 「clsBの追加処理、lVarAもアクセスできる」; } }; void main() { clsA oA; clsB oB; oA.vFunc(); oB.vFunc(); }
- yatokesa
- ベストアンサー率40% (201/496)
私もあまり詳しくはないのですが、確か出来なかったと思います。ので、わたしは clsBを生成するときに clsAを渡し、clsBのコンストラクタの中でメンバー変数に保存するようにしています。 class clsB{ public: clsB(clsA* pA){m_pA = pA}; ~clsB(){}; void vfFuncB(){ printf("clsB::vfFuncB\n"); printf("clsA::lVarAをアクセスしたい\n"); }; private: m_pA; }; クラス生成時 clsB oB(this); ってな具合ですが、どうでしょう?
- sueoka
- ベストアンサー率38% (24/62)
こんにちわ 以前にも似たような質問があり、僕も回答させてもらいましたので、 それを紹介しておきます。 頑張ってください!
補足
実際にはclsAはATLのCOMのメソッドです。 ゆえにclsAのコンストラクタを細工するのは避けたい。 また、clsBがclsAの寿命中に常に常駐するのは避けたい。 ところで (10) : error C2079: 'oB' が 未定義の class 'clsB' で使用されています。 (11) : error C2228: '.vfFuncB' : 左側がクラス、構造体、共用体ではありません。 がてるのです。何処が悪いの? #include <stdio.h> class clsB; class clsA{ friend class clsB; public: clsA(){}; ~clsA(){}; void vfFuncA(){ clsB oB; oB.vfFuncB(this); } void vfSet(long lA){lVarA=lA;} long lfGet(void) {return lVarA;} private: long lVarA; }; class clsB{ public: clsB(){}; ~clsB(){}; void vfFuncB(clsA* oB){ oB.vfSet(123); }; }; // COMの呼び出し側はclsBの存在を知らない。 void main(void) { clsA oA; oA.vfFuncA(); }
お礼
class A { public: void f(){B b; b.f(this)}; void set(long x){v=x;} private: long v; }; class B { public: void f(A* a) { a->set(123); } }; void main() { A a; a.f(); } で実装しました。