- ベストアンサー
クラスの関数をまとめて実行するには
C++勉強中の者です。本屋にでも行けば分かる内容だと思うのですが、急を要するので何卒お願いします。 たとえばA,B,Cというクラスを動作させる場合、 a->Update(); b->Update(); c->Update(); このようにインスタンスの数だけ記述するのではなく、一律した処理で済ませたいです。昔どこかで読んだ本で仮想関数を使えばできると書いてあったのですが、その原理がよく分からなくて困っています。どうすれば可能でしょうか。 ちなみに、 ABCUpdate() { a->Update(); b->Update(); c->Update(); } こういう関数を作ればいいというのはナシでお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
普通に考えたら仮想関数でしょうね……。 class Updatable { public: virtual ~Updatable() { } virtual void Update() = 0; }; を用意しておいて, class A : public Updatable { /* ... */ } class B : public Updatable { /* ... */ } class C : public Updatable { /* ... */ } のように各クラスはUpdatableを継承し, std::vector<Updatable *> updatables; updatables.push_back(a); updatables.push_back(b); updatables.push_back(c); のようにstd::vectorなり配列なりに追加しておけば, for (int i = 0; i < updatables.size(); ++i) updatables[i]->Update(); のように書けます。 # 上記では警告がでるかもしれませんが。
その他の回答 (2)
- toda hiro(@hiro_knigh)
- ベストアンサー率39% (59/151)
一括して行うということで良いでしょうか? 多分以下のような方法が取れると思います。 クラスA,B,Cの親クラスをSとする。 -----クラスの宣言------------------------- class S{ public: virtual void update(); }; class A : public S{ public: void update(); }; class B : public S{ public: void update(); }; class C : public S{ public: void update(); }; void S:update() { } void A:update() { } void B:update() { } void C:update() { } -----ソースコード------------------------- main() { A a; B b; C c; S *s[3]; s[0] = &a; s[1] = &b; s[2] = &c; for (int i = 0 ; i < 3 ; i++ ){ s[i]->update(); } } ----------------------------------------- 親クラスのポインタに子クラスのポインタを代入し、使用する所が味噌です。 変数sはvector等で実装するか、自分でリスト構造で実現するか等します。
お礼
回答ありがとうございます。 ぜひ参考にさせていただきます。
- Tacosan
- ベストアンサー率23% (3656/15482)
急いでいるというのはさておいて, 質問の内容が今一つ読み取れません. ・クラス A, B, C と a や b や c の関係はどうなっていますか? あるいは A, B, C といったクラス同士の関係はどうなのでしょうか? ・「一律した処理」ってどういうこと? 普通の日本語では「一律する」という表現は意味を持たないと思うので, もっと分かりやすい表現をお願いします.
お礼
A a; B b; C c; として、それぞれのクラスについての共通点はUpdate()というメソッドを持っていることだけです。 インスタンスの数に関わらずに1行(行がどんどん増えたりないという意味での一律)で書けるような方法を探しています。分かりにくくて申し訳ありません。
お礼
回答ありがとうございます。 僕の記憶では確か、 親クラスがUpdate()を実行すると、子クラスでオーバーライドされたUpdate()も勝手に実行されるような仕組みがあったような気がするんですが、勘違いの可能性が高そうですね。 ともかく参考にさせていただきます。