• ベストアンサー

至急教えてください(VC++)

VC++の質問です。 クラスA : クラスBを宣言 B b; クラスB : クラスCを宣言 C c; クラスC クラスCからクラスBでpublicで宣言されている関数を読み出すには どうしたらよいのでしょうか。 自分を宣言したクラスのポインタを取得する関数とかがあるのでしょうか。

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

  • ベストアンサー
  • KanKou
  • ベストアンサー率100% (1/1)
回答No.2

クラスCのコンストラクタでクラスBのアドレスを 渡せばいいのでは。 ClassB b: ClassC c(&b); ClassC::ClassC(ClassB *pB) { m_pB = pB; } とすれば、 クラスC内で m_pB->XXXX(); とコールできるはずです。

noname#794
質問者

お礼

ありがとうございます。 上記の方法でうまくいきました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (3)

  • sueoka
  • ベストアンサー率38% (24/62)
回答No.4

#1のsueokaです これまた少し違うかもしれませんが・・・ ---------------------------------------- #include <stdio.h> class B { pubic:  static int func() {   return (1);  }; }; class C { public:  void start() {   printf("%d\n", B::func());  }; }; void main() {  C *c = new C();  c->start();  delete(c); } ---------------------------------- こんな方法も在ります。 ただまぁ、これもC以外からもこの関数が呼べるので、 kuuchさんの求めているのとはちょっと違うかなぁ。 参考までにどうぞ・・・ 少なくとも、宣言元を取得する関数はないと思います。 #2のKanKouさんのように「呼出し元は俺様だ!」と 宣言したクラスに渡すのが一番スマートかな。

noname#794
質問者

お礼

2回も回答ありがとうございます。 KanKouさんの方法でとりあえずはうまくいきました。 いろんな方法があるようでびっくりしています。 時間に余裕ができたら、いろいろ勉強したいと思います。

全文を見る
すると、全ての回答が全文表示されます。
  • mkii
  • ベストアンサー率40% (43/105)
回答No.3

こんな感じでいいですか? class B; class C { public: B *m_pB; startC(); }; class B{ public: B(); start(); fromC(); C c; }; B::B() { c.m_pB = this; } B::start() { c.startC(); } B::fromC() { } C::startC() { m_pB->fromC(); } void main() { B b; b.start(); }

noname#794
質問者

お礼

回答ありがとうございます。 KanKouさんの方法でとりあえずはうまくいきました。 今、ほんとに時間がない状態なので、余裕ができたらmkiiさんの方法も試してみたいと思います。

全文を見る
すると、全ての回答が全文表示されます。
  • sueoka
  • ベストアンサー率38% (24/62)
回答No.1

クラスA,B,Cは継承ではないんですよね。 static publicとか言う関数でもないんですよね。 それだったら、クラスCの中でクラスBを作成(宣言)して、 それに対して関数を呼ぶしかないんじゃないのかなぁ。 ちょっと自身無いですけど。

noname#794
質問者

補足

その方法はすでに試してます。 うまく動かなくて、クラスBをクラスAでじゃなく、グローバルで宣言しちゃったんですけど、それじゃあ、カプセル化にならないかなって思ってます。 グローバルだと、どのクラスからもアクセスできるようになっちゃうんですよね。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • VC++についてです

    クラスの中で他のクラスで定義した変数を使う場合はどのようにしたらいいのでしょうか?又、Cで作ったプログラムをVC++組み込もうとしているのですが、変数宣言等はどのクラスのどこにすれば、他のクラスでも使えるようになるのでしょうか? よろしくお願いいたします。

  • VC++2010を覚えたい(極めたいではない)

     ExcelVBAで実験データを整理していますが、Excelのみでしか使えない等の問題からVC++2010をそこそこ使えるようになりたいのです(極めようとまでは思っていません)。先日もここで質問させていただいたのですが、メッセージボックスを出したりファイル操作をしようとすると、知識不足のためコードが正しく書けずエラーばかり出て格闘しています(VBAだと、msgbox"こう書けば表示される" の一行で済むことをやるのに、かなり格闘します)。  そこで、これら基本動作を完全に使いこなせるようにするために勉強をしたいのですが、何について勉強すればいいのかよくわかりません。どんな本を買って何を勉強すべきでしょうか?いい本があったら教えてください。特にできるようになりたいことを下に書きます。 1 #include <stdio.h>とかのインクルードファイルを宣言する位置。 2 intやdouble等の変数宣言も、たまにエラーでできないことがある。   関数内では変数宣言の方法が違うのかな?   String^ でどうして^がついたりつかなかったりするかわからない。   これでエラーとかよく出ます。^は大嫌い>< 3 メッセージボックスとかの表示。messageboxの前や後ろにshowとか::とかどうして必要か   わからない。メッセージボックスに確認する変数の数値を出すのも難しい。 4 データファイルをいろいろ操作したい。データファイルはテキストデータのみ 5 グラフもVC++で書けるとうれしい。必要があるときだけでいい。 forやif等の制御構造、配列、ポインタ等はもう知っています。 これらができるようなるには、「クラス」とかを勉強するとわかるのでしょうか? クラスが何のことだかもわかりませんが。

  • VC++6でfgets関数の変わりになるような関数はあるのでしょうか。

    現在、VC++6を用いて、MFC を使わずにアプリケーションを作っています。 アセンブラ経験はありますが、C言語経験がないので、四苦八苦しています。 今回、 csv形式のファイルを読込んで、配列に格納したいのですが上手くいきません。 c言語の場合は、fopen関数で開いたファイルを、fgets関数で1行づつ読込み、 strtok関数で、処理すれば良いということが分かりました。 ところが、VC++6のCreateFile関数では、ファイルのポインタの変わりに、 クラスのハンドルが返ってくるので、fgets関数は使えないような気がします。 なにかfgets関数の変わりになるような関数はあるのでしょうか。 質問の意味が分かりずらいかと思いますが、適当に汲み取って教えて下さい。 宜しくお願いします。

  • C++ クラスについて

    クラスについて今勉強しています。 そこで質問なんですが クラスの中にクラスというのは実現可能なのでしょうか? クラスAの中にクラスBとクラスCが入っている状態で、 クラスAの中にある関数XでクラスBやCの関数を呼ぶような処理を目指しています。 またクラスAに宣言されている変数をクラスB,Cの中で変更したりできないでしょうか?

  • VC2010の開発

    VC++(2010)でプログラミングを行っています。 #define A1 (String型) #define A2 (Int32型) #define A3 (Int32型) #define B1 (String型) #define B2 (Double型) #define B3 (Double型) #define C1 (String型) #define C2 (Double型) #define C3 (Double型) 上記のようなA、B、C(型が異なる)をリストで管理したいです。 イメージとしては XX list = {{A1, A2, A3}, {B1, B2, B3},{C1, C2, C3}} です。 テンプレートクラスで実装できますか? また、別な方法があれば教えてください。

  • ソースファイルの分割について

    a.h クラスの定義 a.cpp クラスのメンバ関数の定義 b.h #include "a.h" クラスの定義 b.cpp クラスのメンバ関数の定義 ----c.cpp---- #include "a.h" #include "b.h" a.hで定義したクラスの宣言 b.hで定義したクラスの宣言 メインの処理 ----------------------------------------- b.cppで定義しているクラスのメンバ関数にて a.cppで定義したクラスのメンバ変数にアクセスしたいのです。 どうするのが一番良いのでしょうか? a.cppにメンバ変数を返すだけの関数を定義してb.cppでc.cppで宣言したa.hのクラスを extern宣言してみたのですがエラーが出てコンパイルが通らないです。

  • プロトタイプ宣言について

    C言語で関数を作成しプロトタイプ宣言するときの質問です。 関数実体の引数に構造体のポインタを宣言します。 プロトタイプ宣言には,構造体のポインタを宣言したのと同じ位置にvoid *を宣言します。 関数実体とプロトタイプ宣言は,異なるファイルです。 このように作成した関数は,VC++2008では,コンパイルできるのですが, なぜ関数実体の宣言とプロトタイプ宣言の型が異なるのにコンパイルできるのでしょうか? また,この関数を別ファイルの関数から呼び出した場合,正しく引数を理解し,正しく処理されます。 これは,言語仕様として正しい書き方なのでしょうか? それとも環境依存の書き方なのでしょうか? ご存知の方がいましたらお答えお待ちしています。

  • C#とVC++.NETについて教えて下さい。

    質問タイトルが漠然としててごめんなさい。 特別なソフトを作る訳ではないのですが、暇プロレベルで最近やっと 苦労の末、.NET以前のVC++を理解できて、VC++ってMFC を使う為の言語のだなーと思っている感じです。 C#は購入済みですが、まだ触ってません。VC++.NETは未購入 の状態です。 そこで質問なのですが、  (1)WIN32アプリにはC#とVC++.NETどちらが適していますか?  (2)VC++.NETはやはりMFC寄りの言語なのでしょうか? インラインアセンブルとかもやりたいのですが、  (3)VC++.NETではできますか?C#では? C#は見た目がC言語でクラスも使えるのでVC++.NETとどう違う のか良くわかりません。自分的にはC言語でなんでもやって行って、 C++はクラスが分かる程度で良しとしようと思っています。 詳しい方、漠然とした質問で申し訳ございませんが、ご教授お願いします。

  • 基本クラスのポインタで、派生クラスのメンバ関数を呼び出す方法?

    VC++でプログラミングをしています。 A(基本クラス) B(派生クラス) を作成しました。Bは、Aの特別な場合です。 このとき、基本クラスAのポインタから、派生クラスBにのみあるメンバ関数を呼ぶことはできないのでしょうか? 基本クラスAにも同じ名前の関数があれば、仮想関数をオーバーロードすれば呼び出せるようですが、この関数は、基本クラスには不要なので、できれば使わないメンバ関数を基本クラスに書きたくありません。 (純粋仮想関数という方法もあるようですが、) 操作としましては、 Aのポインタ配列 A* a[100]を作成し 特別な場合のみ派生クラスBのメンバ関数だけを実行させたいのです。 派生クラスにのみあるメンバ関数を、Readとします。 for(i=0;i<100;i++){ if(派生クラスBの場合){ a[i]->Read() } } 現状では、コンパイルエラーで、 関数Readは、aのメンバ関数ではありませんとなってしまいます。 以上よろしくお願いします。

  • MFC VC++ 6.0 使用 

    //自分が作ったクラス class Point{ double a; double b; private; Point(double A,double B){a=A,b=B} double GetA(){return a} double GetB(){return b} } //グローバル宣言 Point point(12.0,4.5); //MFCから 与えられたもの CModel::OnDraw(CDC* pDC){ pDC->TextOut(0,0,"HELLO"); } //自分で追加した関数 クラスウィザード を 作ったときにできた。 CModel::MyMeasure() { double answer = point.GetA-point.GetB; Invalidiate(); } 今やっていること やりたいことを簡略化して かきました。 MyMeasure は 自分が クラスウィザードを作成したときに追加した関数です。この 中で 再描画をしたいのですが "HELLO"が 表示されない ばかりか 自動的に クライアント領域(? 実行画面 最初に "HELLO"が でてくる 画面)が消えてしまいます。 どうしてなのでしょうか? これは あくまで 簡略化したものです。 もしかしたら 初歩的な問題なのかもしれませんが、できるだけ 詳しく説明おねがいします。。初心者のため(--) お願いします。

このQ&Aのポイント
  • 初心者でも安心して使えるA3プリンターを選ぶポイントとして、トレイの種類に注目しましょう。
  • A3プリンターには一段トレイ、二段トレイ、多目的トレイという異なる種類がありますが、それぞれの特徴を把握しておくことが大切です。
  • 価格にも影響するトレイの違いについて詳しく解説します。また、印刷だけでなくコピーも可能かどうかについても触れます。
回答を見る

専門家に質問してみよう