Domanda

che sto facendo (qualcosa di simile) in questo modo:

void insert(Node*& node, string val, Node* parent)
{
   if (node == NULL)
     instantiateNode(node, val, parent);
   else
     insert(node->child, val, node);
}

Il fatto è, che instantiateNode(..., parent) sembra modificare il *&node originale passata nella funzione durante l'impostazione del *parent. instantiateNode() è dovrebbe per modificare la node, ma se si altera il parent di quello che hai un nodo che è impostato al suo genitore, che non ha senso, e anche non funziona. A tutti.

La ragione per cui sto fastidio con i riferimenti di puntatore a tutti è perché elimina casi particolari e riduce significativamente la quantità di controllo degli errori che devo fare. Dal momento che lo sto facendo per ridurre il numero di linea e banale la duplicazione algoritmo-ish, posso ottenere intorno a questo di circa raddoppiando il numero di linee di codice. Ma io non preferisco, e mi sento come se ci dovrebbe essere un modo per dereference un riferimento puntatore per ottenere un nuovo puntatore che punta allo stesso oggetto. E, davvero, ho pensato che passa di *&node attraverso *parent avrebbe dovuto farlo, ma a quanto pare è gcc ottimizzare fuori.

È stato utile?

Soluzione

  

ci dovrebbe essere un modo per dereference un riferimento puntatore per ottenere un nuovo puntatore che punta allo stesso oggetto.

Bene, come su questo?

Node* n = node;

Ora hai un puntatore non di riferimento che punta allo stesso oggetto come nodo, esattamente quello che hai chiesto.

Sono sicuro che il 95% il problema che si trovano ad affrontare non ha nulla a che fare con i riferimenti, e tutto a che fare con la logica difettosa nel instantiateNode o il vostro uso di esso. Ecco perché sarebbe utile se ci hai dato ulteriori informazioni su ciò che si suppone che il codice per fare, o anche postato il codice per instantiateNode.

Altri suggerimenti

nodo è un riferimento a un puntatore, il che significa che se la funzione imposta nodo, il valore passato viene modificato. Ecco come funzionano i riferimenti.

Se non si desidera che il nodo di cambiare in funzione di chiamata, non rendono un punto di riferimento.

O ho frainteso qualcosa?

Non credo node deve essere passato per riferimento. Un semplice puntatore dovrebbe fare il lavoro. Questo è perché non c'è mai bisogno di cambiare direttamente. Perché si passa a instantiateNode()? Sarà sempre NULL, quindi a che serve fare? Se instantiateNode() ha anche il suo primo argomento passato come riferimento, perché? Si passa nel genitore, in modo instantiateNode() può semplicemente accedere alla cosa node dovrebbe rappresentare via parent->child. Anche se per qualche motivo instantiateNode() ci vuole è param per riferimento ed è tenuto a farlo, credo che la funzione continua a funzionare se si rilascia il riferimento dal primo argomento di insert(). Qualunque sia instantiateNode() fa con quel valore saranno semplicemente persi quando la funzione ritorna. Mi dispiace che sia così confuso, ma non riesco a pensare ad un modo migliore per parola di esso.

C'è un'altra interpretazione del problema ... forse la chiamata a insert() dovrebbe leggere:

insert(node, val, node->child);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top