声明具有不同类型的struct属性

时间:2016-05-04 07:55:16

标签: c struct void-pointers

我有一个包含可以采用多种类型的属性的结构, 我想询问最合适的方式来声明这个属性。

示例:

struct 
{
void* pShape; //poiter to the shape that will be casted on *tCircle or *tRectangle
int type;//type of the shape
int h;
int l;
}tImage;

struct{
int size;
int r;
HANDLE calcul;
}tCircle

struct{
int size;
int x;
int y;
HANDLE calcul;
}tRectangle;

如您所见,我使用void *声明指向形状的指针,并使用type属性来猜测形状的类型。

这是我计算图像中形状大小的功能

int Image_Get_ShapeSize(tImage Im)
{
 switch (Im.type)
 {
 case CIRCLE:
 ((tCircle*)(Im.shape))->calcul();
 break;

 case RECTANGLE:
 ((tRectangle*)(Im.shape))->calcul();
 break;

 default:
 break;
}
}
你认为这是一个好方法吗?

1 个答案:

答案 0 :(得分:1)

我不明白为什么你需要tCircle和tRectangle结构,因为它们具有相同的字段。我建议你只使用一个定义,并将函数指针初始化为一个不同的特定方法。

struct shape {
    int size;
    int x;
    int y;

    void (*calcul) (struct shape * shape);
};

然后是具体的功能:

void circle_calcul(struct shape * shape)
{
    ...
}

void rectangle_calcul(struct shape * shape)
{
    ...
}

最后:

struct shape circle;
struct shape rectangle;

circle.calcul = circle_calcul;
rectangle.calcul = rectangle_calcul;