2

オブジェクト指向プログラミングをシミュレートしたいので、C++で次のCコードを考えてみましょう。

typedef struct tAnimal{
   char * name;
   int age;
}tAnimal;

typedef struct tAnimal2{
   char * name;
   int age;
   float size;
}tAnimal2;   

C ++では、同じクラスから継承されるさまざまなオブジェクトのテーブルを作成できます。Cでも同じことをしたいので、次のコードを考えてみましょう。

tAnimal ** tab;
tab = malloc(sizeof(tAnimal*)*2);
tab[0] = malloc(sizeof(tAnimal));
tab[1] = malloc(sizeof(tAnimal2));

mallocがvoidポインターを返し、Cはキャストを必要としないため、割り当てが機能することに注意してください。しかし、タブ要素のタイプは結局t​​Animalであるため、サイズフィールドにはまだアクセスできません。

これを修正する方法はありますか?、void**ポインタを避けたいと思います。

4

3 に答える 3

3

Cでは、タイプフラグとunionデータの構造を使用するのが一般的です。

typedef enum
{
    Animal1,
    Animal2
} AnimalType;

struct Animal
{
    AnimalType type;

    union
    {
        tAnimal  animal;
        tAnimal2 animal2;
    };
};

Animalこれで、構造体の配列を作成できます。

于 2013-01-19T15:22:52.287 に答える
0

sizeのフィールドにアクセスするためにtab[1]、ポインタをtAnimal2ポインタにキャストできます。

 tAnimal2* panimal2 = (tAnimal2*) tab[1];
 panimal2->size = 1.0;

ただし、tAnimal2にキャストするテーブルの要素が実際にtAnimal2のインスタンスであることを確認するメソッドが必要になるため、この方法ではデータが破損する傾向があります。Joachim Pileborgがオブジェクトのタイプをチェックするように提案しているので、追加のタイプフィールドを使用できます。

于 2013-01-19T15:32:58.067 に答える
0

サイズフィールドにアクセスする場合は、ポインタをtAnimal2にキャストする必要があります。同じことがC++にも当てはまることに注意してください。

2番目の構造体の先頭に最初の構造体を埋め込むことで、継承をシミュレートできます。

struct tAnimal{
   char * name;
   int age;
};

struct tAnimal2{
  struct tAnimal parent;

  float size;
};
于 2013-01-19T15:22:43.470 に答える