みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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;
}
//------------------------------------------------------

投稿日時 - 2012-06-06 18:19:10

QNo.7518140

困ってます

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

Aを極力触りたくないのであれば、あまりカッコよくありませんが、AがBを継承するではどうでしょうか?
提示コードを以下のように書き換えれば、とりあえず期待する動きはすると思います。

//------------------------------------------------------
class B {
public:
virtualvoid bbb();
};
//------------------------------------------------------

//------------------------------------------------------
class A: public B{
public:
void aaa();
};
//------------------------------------------------------
※ その他はそのまま

投稿日時 - 2012-06-07 17:05:33

お礼

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

投稿日時 - 2012-06-07 17:21:46

ANo.3

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.2

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

投稿日時 - 2012-06-07 16:32:59

お礼

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

投稿日時 - 2012-06-07 17:27:44

ANo.1

zwi

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

投稿日時 - 2012-06-07 12:57:11

お礼

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

投稿日時 - 2012-06-07 19:07:35