2012-06-20 29 views
8

Soy un novato de Java. Pude comprender el concepto de convertir punteros C/C++ en referencias de Java y esto ha ido bastante bien.C++ Punteros a punteros en Java

Pulso un fragmento de código que tiene punteros a punteros (es decir, ** ptr). Tengo que eliminar la referencia del puntero y cambiar el valor del puntero al que apunta (es decir, * ptr = & newthing;)

Esto parece mucho más difícil en Java. ¿Alguien tiene alguna idea sobre cómo resolver este problema? La búsqueda rápida en Google no arrojó nada.

Aquí hay un ejemplo de código en C++. Quiero conseguir algo similar que trabaja en java, pero la variable ptr_to_ptr es 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 no tiene punteros? –

+6

@KazekageGaara El OP está hablando de lo que un "puntero a puntero" en C++ se traduciría en Java. – NominSim

+3

Java no permite que el programador use punteros o aritmética de puntero como C/C++.Será mejor si publicas cuál es tu problema específico (incluido el fragmento de código sería bueno dependiendo del problema). –

Respuesta

3

Voy a responder mi propia pregunta. No pude encontrar una manera fácil de hacer un puntero a un puntero (referencia a una referencia) en java. Así que refactoré el código para usar matrices de referencias e índices de matriz en lugar de punteros. I piensa esto funcionará (se codificó fácilmente) pero aún no lo he probado.

+0

Esto funcionó. Es un código feo, pero si REALMENTE necesita portar código C++ con muchos punteros a Java, puede hacerlo utilizando clases para las estructuras y punteros y punteros a punteros. No publicaré el código, es demasiado feo. Pero cumplió mi propósito y se ejecuta más rápido que las búsquedas de matriz, ya que estoy engañando a Java para que use referencias como "punteros". – Batdude

+4

Debería considerar aceptar la respuesta de @ dasblinkenlight ya que él es el primero en sugerir el uso de matrices –

1

Java no tiene punteros. Pero se puede decir que cuando crea un Object, está creando una referencia (puntero) a ese Object.

Por ejemplo:

Object obj = new Object(); 

Así la referencia obj apunta realmente a la nueva Object que acaba de crear.

Ahora, si desea traducir el concepto de puntero a un puntero, puede simplemente crear una referencia que apunte a una referencia existente.

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

¿Por qué votar abajo? –

+1

No, eso es una copia. Obj2 y obj apuntan al mismo objeto. Necesito una referencia a un objeto que hace referencia a un objeto. – Batdude

+0

@Batdude Ok. Mi respuesta es incorrecta, pero aún así la dejaré, porque su pregunta parece ser la que buscarán muchas personas. Entonces, mi publicación les hará saber que el concepto que ofrecí fue totalmente erróneo. –

13

Un típico truco se podría utilizar para modelar punteros a punteros en Java es la utilización de matrices: una referencia a la matriz en sí sirve como el "puntero", mientras que el elemento de la matriz sirve como el elemento señalaron. Puedes anidar estos tanto como quieras, pero el código no se ve tan bien como en C/C++.

En lugar de trasladar los modismos C/C++ a Java, debe crear una clase mutable que le permita cambiar el elemento dentro de ella. Esta clase serviría como un "puntero" para darle la funcionalidad que está buscando, y también agregaría legibilidad a su código de Java. Los genéricos simplifican enormemente su tarea y solo requieren una implementación que pueda volver a utilizar.

4

El puntero a Puntero no se puede cartografiar directamente en Java. Supongo que quiere asignar un nuevo objeto a un puntero dentro de una función.

Por lo que yo sé que sólo se puede resolver mediante el uso de un objeto de contenedor que sirve de referencia, por lo que puede modificar la referencia real dentro:

class ObjRef { 

    public RealObj obj; 

} 

void modifyRef(ObjRef ref){ 

    ref.obj = new RealObj() 

} 

espero que esto ayude

+0

Este es prácticamente el código que dasblinkenlight está describiendo en su respuesta. – Joe

+0

@Joe Y lo proporcioné. Además, él está usando arreglos, yo no. – TeaOverflow

+0

También se describe la creación de una clase mutable con Generics que en realidad sería una solución más reutilizable. Lea la publicación completa antes de ponerse a la defensiva. – Joe

0

El único El método "puntero" no es seguro(). Puede asignar memoria con él. Pero no puede salir del área de JVM :)