Foros del Web » Programación para mayores de 30 ;) » Java »

instanciar clase anidada

Estas en el tema de instanciar clase anidada en el foro de Java en Foros del Web. Tengo que instanciar una clase anidada, y estuve leyendo la documentación , pero me da error. Segun lo leído, esto debería funcionar: Código HTML: TriangleMesh.Face ...
  #1 (permalink)  
Antiguo 01/07/2010, 10:13
Avatar de mayid
Colaborador
 
Fecha de Ingreso: marzo-2009
Ubicación: BsAs
Mensajes: 4.014
Antigüedad: 15 años, 1 mes
Puntos: 101
instanciar clase anidada

Tengo que instanciar una clase anidada, y estuve leyendo la documentación, pero me da error.

Segun lo leído, esto debería funcionar:

Código HTML:
TriangleMesh.Face theNewFace = mesh.new Face(vertex1, vertex2, vertex3, edge1, edge2, edge3);
Sin embargo, el compilador me dice "cannot find symbol" y me señala la clase Face (donde dice new Face).

Tengo la clase incluida, vean:
import artofillusion.object.*;
import artofillusion.object.TriangleMesh.*;

TriangleMesh es una malla 3d, que alberga puntos, segmentos y vertices. Y justamente Face es una clase anidada en TriangleMesh que define caras de esa malla.

Que puedo hacer? Probe estas otras cosas pero el compilador me marca que me facta un parentesis:

Cita:
TriangleMesh.Face theNewFace = mesh.new TriangleMesh.Face(vertex1, vertex2, vertex3, edge1, edge2, edge3);

TriangleMesh.Face theNewFace = mesh.new mesh.Face(vertex1, vertex2, vertex3, edge1, edge2, edge3);
  #2 (permalink)  
Antiguo 01/07/2010, 11:16
Avatar de mayid
Colaborador
 
Fecha de Ingreso: marzo-2009
Ubicación: BsAs
Mensajes: 4.014
Antigüedad: 15 años, 1 mes
Puntos: 101
Respuesta: instanciar clase anidada

Segun estuve viendo, el "cannot find symbol" se refiere a un problema de path. Es decir, los import que estoy haciendo no estan incluyendo la clase anidada. Entonces, la pregunta sería como incluir las clases anidadas?
  #3 (permalink)  
Antiguo 01/07/2010, 13:21
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 20 años, 6 meses
Puntos: 51
Respuesta: instanciar clase anidada

No es un problema de path. "Cannot find symbol" significa que no encuentra la variable o función que estás llamando, y en este caso lo que no encuentra es el metodo new dentro de la variable mesh, y encima luego hay un paréntesis...

Las clases internas se instancian igual que las externas, problemas de visibilidad aparte, pero hay que darles el nombre completo.

TriangleMesh.Face theNewFace = new TriangleMesh.Face(....

La "receta" es fácil. Lo mismo que escribes al declarar el tipo es lo que has de poner tras el new.

Prueba con eso a ver si tienes visibilidad y ámbito correcto. Si no, te dará otros errores y hay que seguir con el proceso.

S!
__________________
Para obtener respuestas, pregunta de forma inteligente o si no, pregunta lo que quieras que yo contestaré lo que me dé la gana.
  #4 (permalink)  
Antiguo 01/07/2010, 13:30
Avatar de mayid
Colaborador
 
Fecha de Ingreso: marzo-2009
Ubicación: BsAs
Mensajes: 4.014
Antigüedad: 15 años, 1 mes
Puntos: 101
Respuesta: instanciar clase anidada

Cita:
TriangleMesh.Face theNewFace = new TriangleMesh.Face(....
Eso así no me funciona, porque me dice "an enclosing instance that contains artofillusion.object.TriangleMesh.Face is required".

El manual que linkee dice que hay que poner la instancia antes que el new. Pero tampoco funciona.

Las clases anidadas son estas, así:

Cita:
public class TriangleMesh {

public class Vertex{
...
}

public class Edge
{
...
}

public class Face
{
public Face(int vertex1, int vertex2, int vertex3, int edge1, int edge2, int edge3)
{
...}
}


}
  #5 (permalink)  
Antiguo 01/07/2010, 15:33
Avatar de mayid
Colaborador
 
Fecha de Ingreso: marzo-2009
Ubicación: BsAs
Mensajes: 4.014
Antigüedad: 15 años, 1 mes
Puntos: 101
Respuesta: instanciar clase anidada

SOLUCIONADO.

Para casos normales, lo que hablamos mas arriba debiera funcionar. Pera para este caso, tengo que poner entre parentesis la clase TriangleMesh antes de la instancia mesh. No entiendo por que, pero tengo que hacerlo cada vez que invoco algun metodo de mi objeto mesh. Eso es casting?
Cita:
TriangleMesh.Face theNewFace = ((TriangleMesh)mesh).new Face(vertex1, vertex2, vertex3, edge1, edge2, edge3);
  #6 (permalink)  
Antiguo 01/07/2010, 16:01
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 20 años, 6 meses
Puntos: 51
Respuesta: instanciar clase anidada

Ah, si las tienes declaradas así... joer que complicao. Si les pones que las clases son estaticas no hace falta tener una instancia para crearlas, a no ser que por algún motivo te hagan falta crear las clases internas diferentes según la instancia.

S!

PD: Lo de tener que poner lo del casting cada vez será por que el tipo declarado de mesh no es TriangleMesh, si no algun tipo superior en la jerarquía. Y sí, eso es casting. Un poco tedioso si lo has de hacer muchas veces con la misma variable, para eso crea otra con el tipo correcto que apunte a mesh y con UN casting lo tienes solucionado. Eso o redefinir mesh, pero quizá eso no puedas.
__________________
Para obtener respuestas, pregunta de forma inteligente o si no, pregunta lo que quieras que yo contestaré lo que me dé la gana.

Etiquetas: clase
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 06:23.