[C/C++] probleme declaration

Résolu/Fermé
Janou195 - 20 août 2009 à 14:24
 loupius - 21 août 2009 à 12:26
Bonjour,

Voila je veux programmer en c/c++ un intersecteur de polyedre en 3D. Je veut utiliser une structure de donnés de type "halfedge" (https://www.flipcode.com/archives/The_Half-Edge_Data_Structure.shtml pour decrire mes polyedres.


Donc je veux me definir des types particulier mais le probleme, c'est que chacun de ces types utilise au moins un autre de ces nouveaux type donc le compilateur qui parcours le fichier dans l'ordre est perdu. En particulier, un champ de ma structure pour un de ces nouveau type est un pointeur vers ce type lui-meme!

Pour etre plus clair, voici le code de ce que je veut faire:

typedef struct
{
   HEvert *vert;
   HEface *face;
   HEedge *twin;
   HEedge *next;    
} HEedge;

typedef struct
{
   double coor[3];
   HEedge *edge;
} HEvert;

typedef struct
{
   HEedge *edge;
} HEface;

typedef struct
{
   int nbfaces, nbedges, nbvertices;
   HEface *face;
   HEedge *edge;
   HEvert *vert;
} HEpoly;


J'ai essayé de creer à la place des classe avec à la place des (HEtruc *) des (void *) puis de caster en (HEtruc *) dans le constructeur:

////////////////////////////////////////////////////////////////////////
// partial declaration (type of fields casted by constructors)        //
////////////////////////////////////////////////////////////////////////

class HEpoly
{
    public:
        // datas
        int nbfaces, nbedges, nbvertices;
        void *face;
        void *edge;
        void *vert;
        
        // methods
        HEpoly();
};

class HEface
{
    public:
        // datas
        void *edge;
        
        // methods
        HEface();
};

class HEedge
{
    public:
        // datas
        void *vert;
        void *face;
        void *twin;
        void *next;  
        
        // methods
        HEedge();  
};

class HEvert
{
    public:
        //datas
        double coor[3];
        void *edge;
        
        // methods
        HEvert();
};


////////////////////////////////////////////////////////////////////////
// constructor definitions                                            //
////////////////////////////////////////////////////////////////////////
HEpoly::HEpoly() {
    face=(HEface *)face;
    edge=(HEedge *)edge;
    vert=(HEvert *)vert;
}


HEface::HEface() {
    edge=(HEedge *)edge;
}

HEedge::HEedge() {
    vert=(HEvert *)vert;
    face=(HEface *)face;
    twin=(HEedge *)twin;
    next=(HEedge *)next;
}

HEvert::HEvert() {
    edge=(HEedge *)edge;
};


Cette declaration est ok mais je ne peut pas faire par exemple (pointer of type ‘void *’ used in arithmetic):

HEpoly poly1;
poly1.nbfaces=6;
poly1.face=(HEface *)malloc(poly1.nbedges*sizeof(HEface));
poly1.face[1]->edge=1;


Voilà, si quelqu'un à une idée.

Merci
A voir également:

2 réponses

Il suffit simplement de déclarer la classe comme on le fait avec un prototype de fonction.
Par exemple:
class B;

class A
{
  ...
  B* b;
  ...
};

class B
{
  ...
  A a;
  ...
};

Bien sûr cela interdit de créer des objets de la classe B dans A, et permet seulement de définir des pointeurs; c'est dans le constructeur de A que les objets seront réellement créés.
Bonne continuation.
0
Merci cela fonctionne!

Bonne continuation!
0
Je n'en doutais pas ! ;-))
Pour le bien de tous, n'oublie pas de mettre en 'résolu'.
Bonne journée.
0