2016-05-04 1 views
-1

J'ai une structure qui contient un attribut qui peut prendre plusieurs types, Je souhaite connaître la méthode la plus appropriée pour déclarer cet attribut.Déclaration de l'attribut struct avec un type différent

Exemple:

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; 

Comme vous le voyez ici en utilisant i'am void * de déclarer un pointeur à la forme et utiliser l'attribut de type de deviner le type de la forme.

c'est ma fonction pour la calcuation de la taille de la forme dans une image

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; 
} 
} 

que pensez-vous à ce sujet est une bonne méthode?

+0

Comment définit-on '? En anse – sjsam

+0

Je suggère de créer des fonctions spécifiques pour toutes les formes. – bzeaman

+0

Copie possible de [C struct to void \ * pointeur] (http://stackoverflow.com/questions/10319080/c-struct-to-void-pointer) –

Répondre

1

Je ne comprends pas bien pourquoi vous avez besoin des structures tCircle et tRectangle car elles ont les mêmes champs. Je vous suggère d'utiliser une seule définition et d'initialiser le pointeur de fonction à une méthode différente et spécifique.

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

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

Et puis les fonctions spécifiques:

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

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

Et enfin:

struct shape circle; 
struct shape rectangle; 

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

Bonne remarque j'ai mis à jour la déclaration des structures. – fedi