我有一个包含可以采用多种类型的属性的结构, 我想询问最合适的方式来声明这个属性。
示例:
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;
}
}
你认为这是一个好方法吗?
答案 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;