0

基本クラス内から派生オブジェクトのベクトルを作成しようとしています。

class Animal
{
 // Do Stuff
}

class Dog : public Animal

{
 // Do Stuff
}

class AnimalKingdom
{
    vector<Animal> animals;
    vector<Dog> getDogs();
}

vector<Dog> AnimalKingdom::getDogs();
{

    vector<Dog*> dogs;        

    for(i = 0; i < animals.size(); i++)
    {
        Animal& a = *animals[i];

        if(typeid(a).name() == "class Dog")
        {
            dogs.push_back(*a);
        }
    }
}

しかし、明らかに* aは犬へのポインタではないので、犬に追加することはできませんか?

それは理にかなっていますか?

4

3 に答える 3

0

まず、typeid(a).name()コンパイラ固有の文字列を返します。たとえば、私の gcc では、返される文字列はまったく異なるものになります。また、Dog のサブクラスである 3 番目のクラスについて考えてみましょう。typeid(a).name()これは犬ですが、「犬のクラス」ではありません。

オブジェクト タイプのクエリには、dynamic_cast を使用する必要があります。あなたがそうするとき、あなたはdynamic_cast<Dog*>(a)「犬に正しくキャストできますか?」と尋ねています。はいの場合、Dog* 型のポインターがあり、そうでない場合は NULL ポインターがあります。

最後に、 でclass AnimalKingdom、ベクターは Dog 型のオブジェクトを持つことを許可しません。を作成するstd::vector<Animal>と、要素が固定タイプのベクトルが作成されsizeof(Animal)ます。必要なのは、ポインターを操作することです。ポインターは、このアドレスを強制的に任意のサイズまたは基本クラスにすることなく、メモリ アドレスを指します。

もう少し明確にするために:そうすると、タイプであり、 size を持つAnimal a;変数を作成しています。これを行うと、サイズが 4 バイト (または 8 バイト) のメモリ アドレスが作成されます。ポインタのサイズはこのサイズになります。そのため、Animal* が とは異なるものを指している可能性があり、 のサブクラスを指している可能性があります。Animalsizeof(Animal)Animal* aAnimalAnimal

これは、静的割り当て (固定サイズ) と動的割り当て (動的サイズですが、ポインターは固定サイズであることに注意してください) の違いです。

于 2013-02-06T01:10:12.543 に答える
0

あなたの主な問題は、アップキャストできないことを理解することです.これはnullをもたらします. 犬を動物にダウンキャストして、親の最小属性のみを使用することはできますが、

したがって、この問題は次のように簡単に解決できます。2- bool または int を作成して、以下のように動物の種類を確認またはマークします。例: 犬の場合は 2 にします。この変数は動物クラスで定義されています。次に、仮想関数を使用して、実行時に必要なものに動的に移動します。したがって、以下のコードは適切なスケルトンになる可能性があります。

class Animal
{
    int type;
    virtual void setType()=0;
    virtual int getType()=0;
};

class Dog :public Animal
{
    void setType()
    {
        type = 2;
    }
    int gettype()
    {
        return type;
    }
}; 

楽しむ。

于 2013-02-06T11:22:24.070 に答える
0

Animal を Dog にキャストする必要があります。static_cast と dynamic_cast とは何かを読んでください。しかし、一般的に static_cast は、変換先の型がわかっている場合であり、 dynamic_cast は推測であり、その型でない場合は null を返します。

for(i = 0; i < animals.size(); i++)
{
    Animal* a = &animals[i];

    if(typeid(a).name() == "class Dog")
    {
        dogs.push_back(static_cast<Dog>(a));
    }
}

Ps.Im は仕事中なので、そのコードを確認できません。正しく見えます =D

于 2013-02-06T00:57:48.670 に答える