[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?

StackOverflow https://stackoverflow.com/questions/1464758

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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top