2016-09-23 12 views
0

同じサイズの異なる構造体のポインタの配列を持つことは可能ですか?はいの場合は、配列から構造体の変数やメンバーにアクセスできますか?いくつか例を挙げることができますか?C言語で異なる構造体のポインタの配列

おかげ

+0

あなたは* *汎用のポインタの配列( '無効*'のすなわち配列)を持つことができますが、次の条件を満たす必要があります。私はCで、「OOP」を必要とした時 は、私は(一例として)このアプローチを使用しました実際にポインターのそれぞれが指しているものが分かります。あなたが少し間違いをした場合、*未定義の動作*の悪いケースがあります。代わりにデザインを考え直すことをお勧めします。 –

+1

また、これで解決しようとする実際の問題について教えてください。そうすれば、エラーの原因にならないソリューションを思いつくのを手助けすることが容易になります。これは、保守や理解がより容易な方法でなければなりません。 [XY問題についてお読みください](http://xyproblem.info/)、あなたの質問はその一例です。 –

+1

異なる型の 'union'を持つ' struct'を使用し、特定のインスタンスがどの型かを識別するために 'enum'を使います。 –

答えて

1

厳密にあなたがすることはできません話します。しかし、base構造へのポインタを保持することができます!

// http://ideone.com/FhSULX 

#include <stdio.h> 


struct BaseFigure 
{ 
    int type; 
    const char * name; 
}; 

struct RectangleFigure 
{ 
    struct BaseFigure base; // must be first field! 
    int width, height; 
}; 

struct CircleFigure 
{ 
    struct BaseFigure base; // must be first field! 
    float radius; 
}; 

enum {FIGURE_RECTANGLE, FIGURE_CIRCLE}; 

int main() 
{ 
    enum {FIGURE_COUNT = 2}; 

    struct BaseFigure *arrayOfFigures[FIGURE_COUNT]; 
    struct RectangleFigure rectangle; 
    struct CircleFigure circle; 
    int i; 

    rectangle.base.name = "rectangle"; 
    rectangle.base.type = FIGURE_RECTANGLE; 
    rectangle.width = 10; 
    rectangle.height = 20; 

    circle.base.name = "circle"; 
    circle.base.type = FIGURE_CIRCLE; 
    circle.radius = 3.5f; 

    arrayOfFigures[0] = (struct BaseFigure*)&rectangle; 
    arrayOfFigures[1] = (struct BaseFigure*)&circle; 

    for (i = 0; i < FIGURE_COUNT; i++) 
    { 
     struct BaseFigure * const baseFigure = arrayOfFigures[i]; 
     printf("Figure type: %d, name: %s\n", baseFigure->type, baseFigure->name); 
     switch (baseFigure->type) 
     { 
      case FIGURE_RECTANGLE: 
      { 
       struct RectangleFigure * const figure = (struct RectangleFigure*)baseFigure; 
       printf("%s: width: %d, height: %d\n", figure->base.name, 
        figure->width, figure->height); 
      } 
      break; 

      case FIGURE_CIRCLE: 
      { 
       struct CircleFigure * const figure = (struct CircleFigure*)baseFigure; 
       printf("%s: radius: %f\n", figure->base.name, 
        figure->radius); 
      } 
      break; 

      default: 
       printf("Error: unknown figure with type '%d'!\n", baseFigure->type); 
     } 
    } 

    return 0; 
} 
+0

これは素晴らしい解決策です、ありがとうございます。 –

関連する問題