[c ++ / pointeurs]: ayant des objets A et B (B est membre de vecteur, qui stocke le pointeur à A), A savoir est-il possible de récupérer le pointeur à B?
-
13-09-2019 - |
Question
Tout en essayant d'apprendre c ++, j'ai essayé de mettre en œuvre la classe représentant très basique Trie. Je suis venu avec ce qui suit:
class Trie {
public:
char data;
vector<Trie* > children;
Trie(char data);
Trie* addChild(Trie* ch); // adds child node
(skipped others members/methods)
};
Méthode addChild vérifie si l'enfant ch avec les mêmes données est présent dans le vecteur enfants , sinon, il insère là, si oui -. renvoie un pointeur à l'enfant déjà existant
Maintenant, compte tenu de cet extrait de code:
Trie t('c');
Trie* firstchild = new Trie('b');
Trie* secondchild = new Trie('a');
firstchild->addChild(secondchild);
t.addChild(firstchild);
si je dois pointer secondchild , est-il possible de revenir en quelque sorte des pointeurs vers firstChild ou peut-être même t
Je voudrais savoir s'il possible de le faire, parce que la logique de mon code de travail doit traverser la structure arborescente « up » (de noeuds inférieurs à ceux du haut), au parent de l'objet courant. Actuellement, je suis en train d'utiliser la fonction récursive pour voyager vers le bas - mais je me demande s'il existe une autre façon
Je suis désolé si ci-dessus ne sait pas ou si je foiré quelque part, je suis plutôt inexpérimenté et écrit de ma mémoire, sans le code de travail.
La solution
Vous devez ajouter quelque chose comme
Trie* parent;
ou
Trie* previoussibling;
Trie* nextsibling;
à la classe pour obtenir directement de firstchild
à secondchild
ou vice-versa, ou de remonter d'un des enfants à t
.
Notez que si vous avez besoin de ce genre de relation, alors vous aurez besoin de plus d'entretien lors de l'ajout et la suppression des nœuds de garder tous les liens corrects.
Autres conseils
L'objet ne tient pas Trie la trace de l'objet parent. Son essentiellement similaire à la liste liée unique et vous ne pouvez pas traverser en arrière à moins que vous « savez » le parent.
class Trie {
public:
char data;
vector<Trie* > children;
Trie* parent;
Trie(char data):parent(NULL){}
Trie* addChild(Trie* ch)
{ //set the parent
ch->parent = this;
}
(skipped others members/methods)
};
Alors traverserait ressembler à:
traverse(Trie* pPtr)
{
Trie* currentPtr = pPtr;
while(currentPtr)
{
currentPtr = currentPtr->parent;
}
}
Je n'ai que pointeur vers secondchild, est-il possible de revenir en quelque sorte pointeurs vers firstChild ou peut-être même t?
Non. Vous devez établir cette relation de votre auto en passant le firstChild en tant que parent du deuxième enfant.