2

たとえば、Animal クラスがあり、Lion クラス、Tiger クラスなどの他のクラスを作成しました。Animal クラスのリストを作成しました。リストを横断して、リスト内のすべてのメンバーのクラスのタイプに従ってリストを処理したいと考えています。

Class Animal
Class Tiger :: public Animal{}
Class Lion :: public Animal{}
list<Animal> l;
Tiger T;
Lion L;
l.push_back(T); l.push_back(L);
if the top member of the list is Tiger print"ITs a tiger"
else print"something"

単純に、作成したインスタンスの型を確認したい。やり方がわかりません。

4

3 に答える 3

2

これはRTTIと呼ばれ、適切なコーディング方法ではありません。

そうは言っても、クラスのタイプを絶対に知りたい場合は、次のことができます

if (typeid(myanimal) == typeid(Tiger)) {
    // Do something tiger-like
}

あなたの場合に私がお勧めするのはAnimalsayHello()メソッドなど、 all に共通のインターフェースを持つことです。あなたが持っているだろう

class Animal {
    void sayHello() = 0;
    // Other things
}

これTiger

Tiger::sayHello() {
    cout << "Hello I'm a Tiger!" << endl;
}

次に、vector<Animal*>(ポインターを使用する必要があります)から呼び出すだけです

myAnimal->sayHello();
于 2012-10-21T13:22:56.653 に答える
2

タイプ ( typeid) を確認できますが、そうする必要はありません。

を保持するだけで、メソッドを にstd::list<std::unique_ptr<Animal> >持つことができます。このようにして、ポリモーフィズムを利用しています。virtualAnimal

class Animal
{
public: 
    virtual void print() = 0;
};
class Tiger : Animal
{
    virtual void print() { std::cout << "I'm a tiger"; }
};

Animal* pA = new Tiger;
pA->print(); // prints tiger
于 2012-10-21T13:23:07.743 に答える
0

dynamic_cast を使用して、結果が有効かどうかを確認します。しかし!!!!!!!通常は悪い習慣です。あなたの場合、基本クラスで仮想関数 virtual std::string printMe() const = 0; を宣言することをお勧めします。そしてそれを各クラスに実装します。

于 2012-10-21T13:26:25.663 に答える