• ベストアンサー

生成もとのクラスへのアクセス

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(); }

質問者が選んだベストアンサー

  • ベストアンサー
  • yatokesa
  • ベストアンサー率40% (201/496)
回答No.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)
回答No.4

他の方と似たような回答になりますが、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 さんの回答にあるように コンストラクタで関連を持たせるようにする方が良いです。

nakashi
質問者

お礼

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(); } で実装しました。

noname#30727
noname#30727
回答No.3

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)
回答No.2

私もあまり詳しくはないのですが、確か出来なかったと思います。ので、わたしは 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)
回答No.1

こんにちわ 以前にも似たような質問があり、僕も回答させてもらいましたので、 それを紹介しておきます。 頑張ってください!

参考URL:
http://oshiete1.goo.ne.jp/kotaeru.php3?q=109273
nakashi
質問者

補足

実際には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(); }

関連するQ&A

  • ポリモーフィズムがうまくいきません

    タイトルのままなのですが、、うまくできません。 間違っているところの指摘お願いします。 #include <iostream> using namespace std; class kuruma{ public: void view(void){printf("車\n");} }ku; class hutuu : public kuruma{ public: void view(void){ printf("普通車\n"); } }hu; class track : public kuruma{ public: void view(void){ printf("トラック\n"); } }to; int main(void) { char input[10]; kuruma *oya1=&ku , *oya2=&hu , *oya3=&to;; oya1->view(); oya2->view(); oya3->view(); scanf("%s",input); return 0; }

  • クラス内でのpthread_createに関して

    C言語初心者です。 下記のようなソースにて、クラス内でのスレッドを行うことが目的です。 しかし、下記のpthread_createにてコンパイルエラーとなります。 キャストエラーのようなのですが、キャスト方法がわかりません。 初歩的な質問で、大変申し訳御座いませんが、ご教授頂けませんでしょうか? ################################################################ #include <stdio.h> #include <pthread.h> // Testクラス class Test{ private: // スレッド処理 void testThread() { printf("### THREAD START ###\n"); return; } public: // スレッド開始 void threadStart() { // スレッド生成戻り値 int status; // スレッド pthread_t thread; // スレッド生成 status = pthread_create( &thread, NULL, (void*(*)(void*))testThread, NULL ); // スレッド生成結果 if ( status != 0 ) { printf("ERR!! pthread_create NG\n"); } return; } }; // メイン実行 int main(int argc, char *argv[]) { // Testクラスオブジェクト Test test; printf("### TEST START ###\n"); test.threadStart(); printf("### TEST E N D ###\n"); return 0; } ################################################################ 宜しくお願い致します。 以上です。

  •  現在、私はC言語を学んでいます。

     現在、私はC言語を学んでいます。  プログラミングの初期の初期の問題なんですが、 「Hello World」という有名なプログラムがありますよね? それについての質問です。 #include<stdio.h> main() { printf("Hello World"); return 0; } も #include<stdio.h> main(void) { printf("Hello World"); return 0; } も #include<stdio.h> int main() { printf("Hello World"); } もちゃんと表示できます。 ここで質問です。 int main(void) int main() main() main(void) はどう違うんですか? あと、 return 0; はあっても無くてもいいようなんですが どういう意味があるんでしょうか?

  • C言語プログラミングについて

    #include <stdio.h> int main(void) { printf("hello,world\n"); } □■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■ #include <stdio.h> int main(void) { printf("hello"); printf(",world"); printf("\n"); } 上の2つのプログラムをコンパイルするとどのような違いが生じるんですか??printfってどんな働きをするんですか?

  • 何処が間違っていますか?

    ---------------------------------------------------------------------------------------- #include<stdio.h> #include<stdlib.h> #define MAX_LINE 128 int main(void); int main(void) { char buf[MAX_LINE]; int n; printf("降水確率を入力してください。\n"); gets(buf); n = atoi(buf); printf("降水確率は %d %% です。\n",n); if (n >= 50) { printf("傘を忘れずにね。\n"); } else { printf(傘はいりません。\n"); } printf("いってらっしゃい。\n"); return(0); }

  • C言語エラー

    C言語をいじっているのですが、16行目と19行目の「型」の前に「;」がありませんと表示されます。 どこをどう改善すればいいか教えてもらえないでしょうか /*遊び半分*/ #include <stdio.h> #include <process.h> int main() { char dear; printf("ああああ\n"); printf("ああああ \n"); scanf_s("%c", &dear); switch (dear){ case 'A04': ; int main(void); { printf("ああああ\n"); int main(void); printf("あああ\n"); printf("あああ\n"); break; system("pause"); return 0; } case 'C34' : printf("\n"); break; case 'E24' : printf("\n"); break; case 'F38' : printf("\n"); break; default: printf("メッセージはありません\n"); break;} return 0;

  • C言語の初心者です。これを実行してみてください。

    「a」って打ち込んだら「a」ってでましたか? #include<stdio.h> int main(void){ char a; printf("aaa\n"); scanf_s("%c", &a); printf("%c", a); return 0; }

  • c言語のフローチャートについての質問です

    #include <stdio.h> int main (void) { int n; for (n=1900; n<2000; n++) { if (n%4==0 && n%100!=10) printf ("%d",n); else if(n%400==0) printf ("%d",n); } printf("\n"); return 0; } をどなたかフローチャートに直してください JIS規格のものでお願いします

  • C++のクラスの可変引数化を禁止する方法。

    C++のクラスの可変引数化を禁止する方法。 クラスのインスタンスをprintfの引数にするのをコンパイル・エラーにする方法はないでしょうか? コピーコンストラクタや代入のオーバーロードをprivateにしてもエラーが出ないので方法を探しています。 #include "stdafx.h" class CTest { private: int intdata; public: CTest() : intdata(0) { }; private: void operator =(const CTest& src) {} CTest(const CTest& src) {} }; int _tmain(int argc, _TCHAR* argv[]) { CTest ctest; printf( "%s %p\n", ctest, ctest ); return 0; }

  • extern記憶クラス指定子を使う事について

    prg1.cpp----------------------------- #include<stdio.h> void func(void); int gg=5678; int main(void) { printf("main gg=%d\n",gg); func(); return 0; } ---------------------------------- prg2.cpp-------------------------- #include<stdio.h> extern int gg; void func(void) { printf("func gg=%d\n",gg); } ---------------------------------- 以上「prg1.cpp」と「prg2.cpp」という名前のふたつのファイルを作成し、「prg1.cpp」で宣言したグローバル変数を「prg2.cpp」で利用可能にしたいと思っています。 それには、「prg1.cppをコンパイルし、prg2.cppもコンパイルして、両者のオブジェクト(コンパイル後のファイル)をリンクする」と参考書には書いてあったのですが、どのようにしたらリンクされるのかわかりません。 prg.1cpp---------------------- #include<stdio.h> void func(void); int gg=5678; int main(void) { printf("main gg=%d\n",gg); func(); return 0; } #include<stdio.h> extern int gg; void func(void) { printf("func gg=%d\n",gg); } ------------------------------- 以上のように、「prg1.cpp」のファイルに1つにまとめれば、なぜかよくわかりませんが実行できました。 しかし「prg1.cpp」と、「prg2.cpp」をリンクさせてみたいので、教えていただけると嬉しいです。