2015-11-16 1 views
1

J'essaie de lancer un algorithme BFS dans une matrice pour obtenir le chemin le plus court entre ma position et le premier élément accessible trouvé par le BFS. Matrice est constituée par des noeuds définis comme suit:Définition d'un paramètre struct avec le type de la structure

struct node { 
    int distance = -1; 
    node parent; 
    Pos position; 
    //Direction to get into the actual node from the parent's position. 
    Dir direction; 
    Cell cell; 
}; 

je besoin d'avoir une instance du noeud parent (celui précédemment visitée et avec moins de la distance du noeud initial que le noeud réel) pour tracer le chemin le plus rapide en arrière au noeud d'origine une fois l'élément désiré trouvé. Mais il semble que nœud parent; déclaration renvoie une erreur, il est donc possible de déclarer un élément de la structure avec le type de la structure elle-même? ou dois-je le déclarer comme un pointeur sur l'élément?

Vous avez ici les erreurs:

error: field has incomplete type 'node' 
     node parent; 
      ^
note: definition of 'node' is not complete until the closing '} 
     struct node { 
      ^

vous remercie.

+0

Vous devez utiliser un pointeur. Un noeud ne peut pas contenir un autre objet noeud, car ce noeud contiendrait lui-même un autre noeud, qui contiendrait lui-même un autre noeud, qui contiendrait lui-même un autre noeud, qui contiendrait lui-même un autre noeud qui contiendrait lui-même un autre nœud, qui contiendrait lui-même un autre nœud, qui contiendrait lui-même un autre nœud, qui contiendrait lui-même un autre nœud, qui contiendrait lui-même un autre nœud, qui contiendrait lui-même un autre nœud qui contiendrait un autre nœud, etc. –

+0

Si vous pouviez faire cela - avoir une structure à inclure - réfléchir à la façon dont vous pourriez calculer la taille d'une telle structure et ce que cela implique .... –

+0

Choisissez la langue _one_. –

Répondre

1

Ceci n'est pas possible. Une structure ne peut pas contenir une instance de lui-même.

C++ (et C) ont une valeur sémantique. Peut-être que vous utilisez un modèle mental d'une langue différente, dans lequel parent signifierait une référence à un objet stocké ailleurs.

Mais en C++, node parent; signifie un objet appelé parent qui est entièrement stocké dans l'objet externe. Donc, votre code conduirait à une «profondeur» infinie d'objets.

D'après votre description, vous voulez probablement dire se référer à un autre nœud qui est actuellement stocké ailleurs. En C, vous écrivez node *parent;, puis faites très attention. En C++ vous avez quelques options, y compris weak_ptr<node> parent;.

Dans les deux cas, un conteneur non intrusif est une autre option (c'est-à-dire que vos nœuds ne contiennent aucune référence de nœud et que vous avez une autre structure contenant toutes les informations sur les liens).

0

est-il possible de déclarer un élément de la structure avec le type de la structure elle-même?

No.

Vous ne pouvez pas définir quelque chose en termes de lui-même.

Et si les voitures contenaient toujours une copie exacte d'eux-mêmes? Cela fonctionnerait-il? Non! Cela ne cadrerait pas.

Quelle serait la taille? La taille de la voiture serait la somme de la taille de ses roues, de ses sièges, de son volant et, euh, d'une autre voiture ... avec ses roues, ses sièges, son volant et, euh, une autre voiture ... hmm ...