すべてのオブジェクトは、共通の基本タイプまたは同じタイプのものでなければなりません。
class Base { public: virtual void callSameMethod() = 0; }; // abstract base
class Derived1 : public Base { public: virtual void callSameMethod() {:::}; };
class Derived2 : public Base { public: virtual void callSameMethod() {:::}; };
// instances
Base* Alice = new Derived1;
Base* Bob = new Derived2;
Base* YoYo = new Derived1;
この場合、最も洗練されたソリューションは、使用しているC++のバージョンによって異なります。
C++ 03であなたはすべての要素へのポインタを含んでいるコンテナを作成することができます
Base* const list[] = {Alice, Bob, YoYo};
とループ
int length = (sizeof(list)/sizeof(Base*));
for(int i = 0; i < length; ++i) list[i]->callSameMethod();
またはSTDのための通常のを使用して、それを反復:: for_eachを
#include <algorithm>
#include <functional>
std::for_each(list, list + length, std::mem_fun(&Base::callSameMethod));
私は使用をお勧めしません。この場合はn std :: vectorとなります。このベクトルは、初期化と反復のために過度に冗長な構文を使用するよう強制しますが、非常に遅くなります。初期化子リスト内のすべての要素が同じポインタ型、Base*
でなければなりません
#include <initializer_list>
for (auto i : {Alice, Bob, YoYo}) i->callSameMethod();
注:C++ 11をサポートしてコンパイラを使用している場合は
は、しかし、はるかに簡単な解決策があります。そうでない場合は、初期化子リストのタイプが明示的に指定する必要があります。
// alternative declarations with different pointer types
Derived1* Alice = new Derived1;
Derived2* Bob = new Derived2;
Derived1* YoYo = new Derived1;
auto objects = std::initializer_list<Base*>{Alice, Bob, YoYo};
for (auto i : objects) i->callSameMethod();
配列または標準ライブラリコンテナでこれらのオブジェクトはありますか? – Blastfurnace
もしそうでなければ、それらを作ってください:) –
そして、それらは同じタイプまたはベースタイプですか? –