C++で別のクラスの関数を呼び出す方法は?

このQ&Aのポイント
  • C++で、あるクラスのメンバ関数から、別のクラスのメンバ関数を呼び出す方法について知りたいです。
  • 要件として、元のオープンソースコードを書き換えずに新たな機能を拡張したいと考えています。
  • 具体的には、クラスAのメンバ関数aaa()からクラスBのメンバ関数bbb()を呼び出したいですが、どのように実現できるでしょうか?
回答を見る
  • ベストアンサー

c++,ある関数のクラスから別のクラスの関数を呼ぶ

c++で、あるクラスのメンバ関数から、別のクラスのメンバ関すを呼びたいのですが、どのようにしたらできますか? 例えば、以下のような単純なコードを考えています。やりたいことは、Aのメンバ関数であるaaa()からBのクラスであるbbb()を呼びたいと思っています。その理由を少し説明します。ここでは、Aというクラスとmain関数はオープンソースコードを例えています。できるだけ、元のオープンソースコードを書き換えずに新たな機能を拡張したいと思っています。そこで、Bというクラスを使って、元のオープンソースコードに機能を拡張しようとしています。このような理由なので、bbb()という関数はaaa()という関数から呼びたいです。メイン関数には何も書き加えないのがベストです。 現状では、実行すると「this is aaa」という出力しか出ません。ここに「this is bbb」の出力を加えたいです。クラスAとBにある程度コマンドを追加して、解決できないでしょうか。 #include <iostream> using namespace std; //------------------------------------------------------ class A{ public: void aaa(); virtual void bbb(){} }; //------------------------------------------------------ //------------------------------------------------------ class B : public A{ public: void bbb(); }; //------------------------------------------------------ //------------------------------------------------------ void A::aaa() { cout << "this is aaa \n"; bbb(); } //------------------------------------------------------ //------------------------------------------------------ void B::bbb() { cout << "this is bbb \n"; } //------------------------------------------------------ //------------------------------------------------------ int main() { A a; a.aaa(); return 0; } //------------------------------------------------------

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

  • ベストアンサー
  • Layle
  • ベストアンサー率75% (6/8)
回答No.3

Aを極力触りたくないのであれば、あまりカッコよくありませんが、AがBを継承するではどうでしょうか? 提示コードを以下のように書き換えれば、とりあえず期待する動きはすると思います。 //------------------------------------------------------ class B { public: virtual void bbb(); }; //------------------------------------------------------ //------------------------------------------------------ class A: public B{ public: void aaa(); }; //------------------------------------------------------ ※ その他はそのまま

liggghts
質問者

お礼

回答ありがとうございます。 提示していただいたコードで、欲しい結果が得られました。 このとき、クラスBのvirtualはなくても大丈夫なようですね。 本当にありがとうございます。

その他の回答 (2)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

A::aaa の中で出力する.

liggghts
質問者

お礼

回答ありがとうございます。 おっしゃる通り、その方法が手っ取り早いです。 ただ、実際にやりたい事は、「this is bbb」という出力の代わりに、莫大なコードを加えたいのです。 Aという元のコードはあまり変更せずに、機能を拡張したいと思ってます。 その辺りを、説明したつもりだったのですが、伝わっていなかったらすみません。

  • zwi
  • ベストアンサー率56% (730/1282)
回答No.1

継承すれば良いんじゃないの?ってのはダメなのですか?

liggghts
質問者

お礼

回答ありがとうございます。 既に、クラスBはクラスAを継承していますが。 おっしゃられている意味は、クラスAがクラスBを継承すれば良い、ということでしょうか?

関連するQ&A

  • 試作クラス使用C++プログラムが動かない原因

    試しに作成した以下のプログラムにビルドエラーが発生し,困っているので質問しました. コンパイラは,「BBB *b」などクラスポインタ変数の部分がエラーと指摘しているのですが(他にも数か所ありますが…),間違っている理由が分からず困ってます. ご回答,よろしくお願い致します. ----------------------------------- #include <iostream> using namespace std; class AAA { public: // コンストラクタ AAA(){ b = new BBB( this ); } // デストラクタ ~AAA(){ delete b; } // メンバ変数 BBB *b; int i; // メンバ関数 void displayB(){ b->displayA(); } }; class BBB { public: // コンストラクタ BBB( AAA *a ){ this->a = a; } // デストラクタ ~BBB(){} // メンバ変数 AAA *a; int j; // メンバ関数 void displayA(){ printf( "%d\n", a->i ); } }; int main() { // 変数の定義 AAA a; // 変数の初期化 a.i = 2; a.b->j = 5; // 出力 printf( "%d\n", a.i ); a.b->displayA(); return 0; } -----------------------------------

  • 仮想関数と継承について

    #include <iostream> using namespace std; class AAA { public: virtual aaa() { cout <<"aaa(void)"<<endl;} }; class BBB : public AAA { public: virtual aaa(int a) { cout <<"aaa(int)"<<a<<endl;} }; int main() { BBB bbb; bbb.aaa();<--これがエラーになります。 return 0; } どうして、既定クラスの引数なしのaaa()はよぶことが できないのでしょうか?

  • 現在のクラスを生成したクラスに渡したい

    親クラスで生成した子クラス(ダイアログ)から親クラス(ダイアログ)の関数などを使えるようにしたいと思っております。 ちなみに継承クラスで親クラスの関数を使うのではなく、親クラスそのもの(ダイアログ表示)を子クラスから変更できるようにしたいです。 (簡単になりますが…)プログラムの構成は以下のようになっており、thisポインタを渡すか所でエラーが起こってしまいます。 ------------------------------------------------ class AAA { BBB *b; void classBBB{ b = new BBB(this); // こういうことがしたいが、できない void fun( int a ); // ダイアログの表示が変更する(予定) }; class BBB { AAA *a; BBB(AAA *pDlg){ a==pDlg; } void fun(){ int b; a->fun(b); } // 親クラスの関数を呼び出したい }; ------------------------------------------------ ただし、class Aとclass Bを生成する上位階層のプログラム構築をすることはなしとします。 ------------------------------------------------ こんな感じ AAA *a = new AAA(); BBB *b = new BBB(a); ------------------------------------------------ どうしてもclass AAAからclass BBB呼び出したいと思ってます。 何か良い解決法があれば、教えていただきたいです。 宜しくお願い致します。

  • C++ オブジェクトポインタのメリット

    以下の例のように、あるオブジェクトが別のオブジェクトのメンバ関数にアクセスする時、ポインタを使うメリットはあるのでしょうか? ご助言いただきたいです。 よろしくお願いします。 ↓例 オブジェクトAのaaa関数からオブジェクトBのbbb関数にアクセスしてHello!を表示する。 #include <stdio.h> class B { public: void bbb(void); }; class A { public: void SetBObj(B* objB); void aaa(void); private: B* mem_objB; }; int main(void) { A* objA = new A(); B* objB = new B(); objA->SetBObj(objB); objA->aaa(); delete new A(); delete new B(); return 0; } void A::SetBObj(B* objB) { mem_objB = objB; } void A::aaa(void) { mem_objB->bbb(); } void B::bbb(void) { printf("Hello!\n"); }

  • C#でクラス継承について

    下記のようなコードは、可能なのでしょうか? // クラス定義 abstract class Base { int a; Public int A { get{ return a; } } } class Sub1 : Base { int b; public int B { set { b = value; } } }; class Sub2 : Base { // 中略 } static class Program { [STAThread] static void Main(string [] args) { Base aaa = new Sub1(); Base bbb = new Sub2(); func(aaa); // ここでCS1502, CS1503 func(bbb); // ここでCS1502, CS1503 } void func(Sub1 _aaa) { // 中略 } void func(Sub2 _bbb) { // 中略 } } コメントに書いたとおり、CS1502(引数が合わない)が出ます。 func((Sub1)aaa); の様にキャストしないと、動作させることは難しいでしょうか? ※ 実際のコードでは、func(aaa), func(bbb)の呼び出し部分をループでまわしたいと考えています。

  • C++ 静的クラスの役割が分からない

    こんばんは。 C++で静的オブジェクトがなんなのか試しにプログラミングしているんですが どんな役割があるのか試してもよく分かりません。 static class HOGE { public: int *hoge; private: int value[2]; char moji[6]; public: HOGE() { cout << "HOGE\n"; } void MOJI() { strcpy(moji, "MOJI\n"); } void TEST() { cout << "moji = " << moji << endl; } static void staticMOJI() { } }sObj; sObjからは静的メンバ関数と静的メンバ変数は呼び出せるようです。他は呼び出せません。 そのようにするためにstatic宣言をするものなのでしょうか? このsObjからメンバ変数(*hoge)を呼び出すことは無理なんでしょうか?

  • 【C++】関数からクラスに変更するには?

    いつも大変お世話になっています。 VC++初心者です。 関数をクラス化していきたいのですが、具体的にどのようにしたら良いか ご指導頂けませんでしょうか。 例えば、このようなソースがあった場合、どのようにクラス化させるのでしょうか。 (また、下記の例ですと、pulsとsubで1つのグループ、 goodMoringとgoodNightで1つのグループにさせる場合には どうすれば宜しいでしょうか。) //======================= //Tool.hの中身 //======================= int plus(int x, int y); int sub(int x, int y); void goodMorning(); void goodNight(); //======================= //Tool.cppの中身 //======================= #include <iostream.h> int plus(int x, int y){ return x + y; } int sub(int x, int y){ return x - y; } void goodMorning(){ cout << "おはよう\n"; } void goodNight(){ cout << "こんばんは\n"; } //======================= //Main.cppの中身 //======================= #include <iostream.h> #include "Tool.h" int main(){ int a = puls(1,1); cout << a <<'\n'; int b = puls(2,1); cout << b <<'\n'; goodMorning(); goodNight(); }

  • C++ クラス概念

    以下の違いがよく理解できていません。 どなたかご教授お願い致します。 (1)クラスのメンバー変数に static を付けた場合と、 メンバーではない変数に static を付けた場合の違い (2)クラスのメンバー関数に static を付けた場合と、 メンバーではない関数に static を付けた場合の違い [プログラム例] class MyClass { public: static int internalCount; static void func(MyClass& a) {/* ... */} }; static int i; static void f(MyClass& a) { /* ... */ }

  • C++でfriendクラスにしているのにprivateメンバにアクセスできない

    C++でメンバ変数をprivateにして、特定のクラスにだけ公開するようにクラスをfriend指定したのですがprivateメンバにアクセスできませんとエラーが吐かれてしまいます。 先行宣言したりもしてみたのですがどうしても使用できません。 何か心当たりのあるかた教えてください。 class A { friend class B; private: int a; }; class B { public: void test( A *a ) { a->a = 0; } }; コードは違いますがこんな感じのことをしたいのです。 /* コンソールで小さなプログラムでテストしてみると動くのにいざ実際のソースに組み込むと動かないという奇妙な状態です。よろしくお願いします。 */

  • 別ソースファイル、同クラス名、同メンバ関数名で片方の関数しか呼ばれない

    環境は OS:Windows XP コンパイラ:C++Builder6 に付属の bcc32.exe です。 下の3つのソースファイルがあります。 bcc32 -c t1 bcc32 -c t2 bcc32 t t1.obj t2.obj でできる t.exe を実行すると、 f in t1.cpp f in t1.cpp と出力されます。 リンクエラーになるか、または f in t1.cpp f in t2.cpp と出力されることを期待したのですが・・・。 【質問】 複数のソースファイルで、同名のクラス、同名のメンバ関数を存在させたい のですがどうしたらよいでしょうか? ---------------------------------------- t1.cpp #include <iostream.h> class A { public: void f(void); }; void A::f(void) { cout << "f in t1.cpp\n"; } void sub1(void) { A a; a.f(); } ---------------------------------------- t2.cpp #include <iostream.h> class A { public: void f(void); }; void A::f(void) { cout << "f in t2.cpp\n"; } void sub2(void) { A a; a.f(); } ---------------------------------------- t.cpp extern void sub1(void), sub2(void); void main(void) { sub1(); sub2(); }