2012-06-20 24 views
8

Sono un noob Java. Sono stato in grado di cogliere il concetto di convertire i puntatori C/C++ in riferimenti Java e questo è andato abbastanza agevolmente.C++ Puntatori ai puntatori in Java

Ho colpito un pezzo di codice che ha puntatori a puntatori (cioè ** ptr). Devo dereferenziare il puntatore e cambiare il valore del puntatore a cui punta (cioè * ptr = & newthing;)

Questo sembra più difficile in Java. Qualcuno ha qualche idea su come risolvere questo problema? La ricerca rapida su google non ha restituito nulla.

Ecco un esempio di codice in C++. Voglio ottenere qualcosa di simile a lavorare in Java ma la variabile ptr_to_ptr è un problema:

struct _coord 
{ 
    int x; 
    int y; 
    _coord * next_coordinate; 
} coordinate_t; 

coordinate_t buffer[100]; 
coordinate_t * head; 
coordinate_t ** ptr_to_ptr; 

if (wednesday) 
{ 
    ptr_to_ptr = &head; 
} 
else 
{ 
    ptr_to_ptr = &head->next_coordinate; 
} 
*ptr_to_ptr = &buffer[3]; // <<<---- HOW DO YOU MAKE THIS WORK? 
+7

Erm, Java non ha i puntatori? –

+6

@KazekageGaara L'OP sta parlando di come un "puntatore al puntatore" in C++ si sarebbe tradotto in Java. – NominSim

+3

Java non consente al programmatore di utilizzare puntatori o aritmetica del puntatore come C/C++.Sarà meglio se pubblichi quale sia il tuo problema specifico (incluso il frammento di codice sarebbe buono a seconda del problema). –

risposta

3

Risponderò alla mia domanda. Non ho trovato alcun modo semplice per fare un puntatore a un puntatore (riferimento a un riferimento) in java. Così ho refactored il codice per utilizzare matrici di riferimenti e indici di array invece di puntatori. I penso che funzionerà (è codificato facilmente) ma non l'ho ancora testato.

+0

Questo ha funzionato. È un brutto codice, ma se hai VERAMENTE bisogno di portare il codice C++ con un sacco di puntatori a java, può essere fatto usando le classi per le strutture e i puntatori e puntatori ai puntatori. Non posterò il codice, è troppo brutto. Ma è servito al mio scopo ed è più veloce delle ricerche di array, dato che sto ingaggiando java nell'uso di riferimenti come "puntatori". – Batdude

+4

Dovresti considerare di accettare la risposta di @ dasblinkenlight poiché è il primo a suggerire di utilizzare gli array –

1

Java non ha i puntatori. Ma si può dire che quando si crea un Object, si sta creando un riferimento (puntatore) a quello Object.

Ad esempio:

Object obj = new Object(); 

Quindi il riferimento è in realtà obj punti al nuovo Object appena creato.

Ora, se si vuole tradurre il concetto di puntatore a un puntatore, si potrebbe semplicemente creare un riferimento che potrebbe puntare a un riferimento esistente.

Object obj = new Object(); 
Object obj2; 
obj2 = obj; 
+1

Perché il voto negativo? –

+1

No, questa è una copia. Obj2 e obj puntano allo stesso oggetto. Ho bisogno di un riferimento a un oggetto che fa riferimento a un oggetto. – Batdude

+0

@Batdude Ok. La mia risposta è una risposta sbagliata, ma continuerò a lasciarla, perché la tua domanda sembra quella che verrà cercata da molte persone. Quindi il mio post farà loro sapere che il concetto che ho offerto era totalmente sbagliato. –

13

Un trucco tipico si potrebbe usare per modellare i puntatori ai puntatori in Java utilizza matrici: un riferimento alla matrice stessa funge da "puntatore", mentre l'elemento di matrice serve come elemento puntato. Puoi annidarli quanto vuoi, ma il codice non sembra altrettanto bello come in C/C++.

Invece di porting idiomi C/C++ in Java, si dovrebbe costruire una classe mutabile che consente di modificare l'oggetto al suo interno. Questa classe servirebbe da "puntatore" per darti la funzionalità che stai cercando e aggiungerebbe anche leggibilità al tuo codice Java. Generics semplifica enormemente il tuo compito, richiedendo solo un'implementazione che potresti riutilizzare.

4

Il puntatore del puntatore non è direttamente mappabile in Java. Presumo che tu voglia assegnare un nuovo oggetto a un puntatore all'interno di una funzione.

Per quanto ne so si può risolvere solo in questo utilizzando un oggetto wrapper che agisce come un punto di riferimento, in modo da poter modificare il riferimento reale all'interno:

class ObjRef { 

    public RealObj obj; 

} 

void modifyRef(ObjRef ref){ 

    ref.obj = new RealObj() 

} 

Spero che questo aiuti

+0

Questo è praticamente il codice che Dasblinkenlight sta descrivendo nella sua risposta. – Joe

+0

@Joe E l'ho fornito. Inoltre, sta usando gli array, non lo sono. – TeaOverflow

+0

Ha anche descritto la creazione di una classe mutabile con Generics che sarebbe in realtà una soluzione più riutilizzabile. Leggi l'intero post prima di metterti sulla difensiva. – Joe

0

L'unica il metodo "puntatore" non è sicuro(). È possibile allocare memoria con esso. Ma non puoi uscire dall'area JVM :)