[c ++ / ponteiros]: ter objetos A e B (B tem membro do vector, que armazena ponteiro para A), sabendo que A é possível recuperar ponteiro para B?
-
13-09-2019 - |
Pergunta
Enquanto tentando aprender c ++, eu tentei implementar classe representando trie muito básico. Eu vim com o seguinte:
class Trie {
public:
char data;
vector<Trie* > children;
Trie(char data);
Trie* addChild(Trie* ch); // adds child node
(skipped others members/methods)
};
Método addChild verifica se a criança ch com os mesmos dados está presente no vector crianças , se não, então insere-lo lá, se Sim. - ponteiro retorna a criança já existente
Agora, considerando este trecho de código:
Trie t('c');
Trie* firstchild = new Trie('b');
Trie* secondchild = new Trie('a');
firstchild->addChild(secondchild);
t.addChild(firstchild);
Se eu só tenho ponteiro para secondchild , é possível voltar de alguma forma ponteiros para firstChild ou talvez mesmo t ?
Gostaria de saber se é possível fazê-lo, porque a lógica das minhas necessidades código de trabalho para atravessar o trie "up" (de nós inferiores para as superiores), para o pai do objeto atual. Atualmente estou usando apenas função recursiva para viajar para baixo - mas eu estou querendo saber se existe alguma outra maneira
Lamento se acima não é clara ou se eu errei em algum lugar, eu sou bastante inexperiente e escrever da minha memória, sem o código de trabalho.
Solução
Você precisa adicionar algo como
Trie* parent;
ou
Trie* previoussibling;
Trie* nextsibling;
à classe para obter diretamente do firstchild
para secondchild
ou vice-versa, ou para ir para cima de um dos filhos a t
.
Note que se você precisa deste tipo de relacionamento, então você vai exigir mais manutenção ao adicionar e remover nós para manter todos os links corrigir.
Outras dicas
O Trie objeto não acompanhar o objeto pai. É basicamente semelhante a lista ligada única e você não travessia de volta pode não ser que você "sabe" o pai.
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)
};
Então travessia seria algo parecido com:
traverse(Trie* pPtr)
{
Trie* currentPtr = pPtr;
while(currentPtr)
{
currentPtr = currentPtr->parent;
}
}
Eu só tenho ponteiro para secondchild, é possível voltar de alguma forma ponteiros para firstChild ou talvez mesmo t?
No. Você tem que estabelecer essa relação a sua auto, passando o firstChild como um pai do segundo filho.