Foro no oficial de la UPCT

Versión completa: Solución a la Práctica 5
Actualmente estas viendo una versión simplificada de nuestro contenido. Ver la versión completa con el formato correcto.
Páginas: 1 2

Antonio

Tengo una duda, si alguien puede solucionarme la duda sería de gran ayuda.
En la Clase Vector, cuando te pide el tercer constructor:
public Vector (Punto a){
origen = new Punto (0,0);
extremo = a.clonar();
}

ese a.clonar() de qué sirve hay, no habría que poner la componente X y la Y, algo más o menos:
extremo = new Punto(a.getX(),a.getY()) // no se si e metido demasiado la pata pero es que no entiendo lo que hace el a.clonar hay

Jesús Hernández Galián

(02-01-2013, 19:11)Antonio escribió:

[Para ver los enlaces debes registrate]

Tengo una duda, si alguien puede solucionarme la duda sería de gran ayuda.
En la Clase Vector, cuando te pide el tercer constructor:
public Vector (Punto a){
origen = new Punto (0,0);
extremo = a.clonar();
}

ese a.clonar() de qué sirve hay, no habría que poner la componente X y la Y, algo más o menos:
extremo = new Punto(a.getX(),a.getY()) // no se si e metido demasiado la pata pero es que no entiendo lo que hace el a.clonar hay

Verás Antonio...
Si te das cuenta, a.clonar() es exactamente lo mismo que new Punto(a.getX(),a.getY()).
El método clonar es un método de la clase punto que te devuelve una copia del punto invocador.
Fíjate en el método clonar de la clase Punto:
Código:
public Punto clonar (){
        return new Punto (x,y);
    }

Por lo tanto ambas respuestas son válidas, pero ya que tienes un método que te hace lo mismo lo utilizas y ya está. Es una buena manera de utilizar la programación basada en objetos.

Espero haberte ayudado Guiño

Antonio

Vaaale muchas gracias Jesús, ya está la duda solucionada muchas gracias Rolleyes

Rosa

Tengo dos dudas de la práctica. La primera es de la clase Vector. No entiendo por qué cuando te pide un constructor que toma como argumentos dos objetos de la clase Punto, se pone:
origen=a.clonar();
extremo=b.clonar();
y en el anterior constructor también se pone extremo=a.clonar().
¿El a.clonar() en extremo y después en origen, es el mismo?
Tampoco sé si me he explicado muy bien...

Y la otra es que, en el método
public double getX(){
return origen.getX();
}
me aparece este error: "Cannot invoke getX() on the primitive type doble" Y no sé cómo arreglarlo.

Si alguien me ayuda Sonrisa

Jesús Hernández Galián

(04-01-2013, 14:06)Rosa escribió:

[Para ver los enlaces debes registrate]

Tengo dos dudas de la práctica. La primera es de la clase Vector. No entiendo por qué cuando te pide un constructor que toma como argumentos dos objetos de la clase Punto, se pone:
origen=a.clonar();
extremo=b.clonar();
y en el anterior constructor también se pone extremo=a.clonar().
¿El a.clonar() en extremo y después en origen, es el mismo?
Tampoco sé si me he explicado muy bien...

Y la otra es que, en el método
public double getX(){
return origen.getX();
}
me aparece este error: "Cannot invoke getX() on the primitive type doble" Y no sé cómo arreglarlo.

Si alguien me ayuda Sonrisa

Bien Rosa, intentaré explicarme lo mejor que pueda.
En la clase vector hay varios constructores, es decir, que no compares unos con otros, porque en unos se emplean nombres que si los comparas con otros tienden a confusión. Es decir, a la pregunta "¿El a.clonar() en extremo y después en origen, es el mismo? ", la respuesta es no, no es el mismo, solo que los llamé de la misma manera. Con mas detalle:

En este constructor:
Código:
public Vector (Punto a){
        origen = new Punto (0,0);
        extremo = a.clonar();
    }
Dice el enunciado que se introduce un punto como argumento que será el extremo del vector, por lo tanto se iguala al extremo, el porqué clonar ya lo he explicado en este foro, pero te lo repito. clonar() es un método de la clase punto que te devuelve una copia del punto en cuestión. En la práctica se dice que los vectores son inmutables, por lo tanto tienes que crear copias de todos los objetos que entran como argumento.

Existe otro constructor:
Código:
public Vector (Punto a, Punto b){
        origen = a.clonar();
        extremo = b.clonar();
    }
Dice el enunciado que se introduce dos puntos (origen y extremo) como argumento. Que no te confunda el "a" de este constructor con el anterior, no tiene nada que ver. Se igualan origen y extremo a cada punto (clonado) por el mismo motivo que antes.

Bien, respecto a la otra duda...
El método está correcto, la causa del error pueden ser 2 cosas, que no hayas invocado bien el método o que el método de getX() de la clase punto no esté bien definido. Por tanto, mira si está llamando bien al metodo getX() desde el main. Un ejemplo:
Código:
    public static void main(String[] args) {
        Vector a = new Vector (new Punto(2,3), new Punto(4,5));
        double x = a.getX();
        System.out.println(x);
    }
Esto te debería imprimir 2.0
Si te lanza error todo apunta a que no está bien definido el getX() de la clase punto que debería estar así:
Código:
public double getX(){
        return x;
    }

Bueno, espero haberte ayudado Guiño

Rosa

Sí has ayudado, muchas gracias :D
El problema, era que en el constructor Vector sin argumentos lo había dejado tal cual, es decir: " public Vector(){} "
y había declarado, antes, como privadas: " origen = new Punto (), y extremo = new Punto (1,0) "
Pero al ponerlo como tú ya se ha solucionado.

Jesús Hernández Galián

(04-01-2013, 14:55)Rosa escribió:

[Para ver los enlaces debes registrate]

Sí has ayudado, muchas gracias Gran sonrisa
El problema, era que en el constructor Vector sin argumentos lo había dejado tal cual, es decir: " public Vector(){} "
y había declarado, antes, como privadas: " origen = new Punto (), y extremo = new Punto (1,0) "
Pero al ponerlo como tú ya se ha solucionado.
Me alegro un montón porque me he tirado media hora escribiendo!! jajaja Gran sonrisa
Páginas: 1 2