[C ++ / Zeiger]: mit Objekten A und B (B-Vektor Element hat, die Zeiger auf einem speichert), A zu kennen, ist es möglich, zum Abrufen Zeiger nach B?
-
13-09-2019 - |
Frage
Beim Versuch, c ++ zu lernen, habe ich versucht, Klasse zu implementieren sehr einfach Trie darstellt. Ich kam mit dem folgenden:
class Trie {
public:
char data;
vector<Trie* > children;
Trie(char data);
Trie* addChild(Trie* ch); // adds child node
(skipped others members/methods)
};
Methode addChild prüft, ob Kind ch mit den gleichen Daten ist in Vektor Kindern , wenn nicht, dann es fügt es dort, wenn ja -. kehrt Zeiger auf bereits bestehende Kind
Nun, wenn man bedenkt diesen Code-Snippet:
Trie t('c');
Trie* firstchild = new Trie('b');
Trie* secondchild = new Trie('a');
firstchild->addChild(secondchild);
t.addChild(firstchild);
, wenn ich nur Zeiger auf haben secondchild , ist es möglich, irgendwie zurückgeben Zeiger auf first oder vielleicht sogar t
Ich würde gerne wissen, ob es möglich, dies zu tun, weil die Logik meines Arbeits Code muss die Trie „up“ (von den unteren Knoten Oberen), das die übergeordneten aktuellen Objekt zu durchqueren. Derzeit bin ich nur rekursive Funktion nach unten zu reisen - aber ich frage mich, ob es eine andere Möglichkeit existiert
Es tut mir leid, wenn oben unklar ist oder wenn ich irgendwo vermasselt, ich bin ziemlich unerfahren und Schreiben aus meinem Gedächtnis, ohne den Arbeitscode.
Lösung
Sie müssen etwas hinzufügen, wie
Trie* parent;
oder
Trie* previoussibling;
Trie* nextsibling;
auf die Klasse direkt von firstchild
zu bekommen, um zu secondchild
oder umgekehrt oder von einem der Kinder zu gehen bis t
.
Beachten Sie, wenn Sie diese Art von Beziehung brauchen, dann werden Sie mehr Wartung erfordern, wenn das Hinzufügen und Knoten alle Verbindungen korrekt zu halten entfernen.
Andere Tipps
Das Trie-Objekt nicht im Auge behalten von übergeordnetem Objekt. Sein im Allgemeinen ähnlich wie einzelne verknüpfte Liste und Sie können nicht durchqueren zurück, wenn Sie „wissen“ die Eltern.
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)
};
Dann würde aussehen Traverse etwas wie:
traverse(Trie* pPtr)
{
Trie* currentPtr = pPtr;
while(currentPtr)
{
currentPtr = currentPtr->parent;
}
}
ich nur Zeiger müssen secondchild, irgendwie ist es möglich zurückkehren Zeiger selbst zu first oder vielleicht t?
Nein. Sie haben diese Beziehung, um sich selbst zu schaffen, indem die first als Eltern des zweiten Kindes vorbei.