Ayuda con c++

Iniciado por anon77, 2 Mayo 2011, 17:59 PM

0 Miembros y 1 Visitante están viendo este tema.

anon77

Hola,
soy novato con c++ y uno de los primeros trabajos que tengo que hacer es realizar un vector con un índice inferior y otro superior o bien de un determinado tamaño.
Para ello tengo la clase Vector definida de esta forma:
class Vector
{
private:
  int indice_min, indice_max;
   int *data;
  // funciones
public:
 Vector(int size);            //Constructores
 Vector(int indMin,int indMax);
 ~Vector();                    //Destructor
 int& operator[](int i)
 //funciones
}

Pues bien, mi problema viene cuando utilizo el menú. Os pongo un pequeño fragmento de como sería:
if (opcion==1){
  cout<<"Size: "; cin>>sz; Vector a(sz);
  cout<< "Vector de tamaño"<<sz<<"creado"<<endl;
}
else if (opcion==2){
  cout<<"Posicion:";
  cin>>posicion;
  cout<<"Valor devuelto"<<?????????
}

Pues bien, mi duda viene en la opción 2, cuando quiero que me escriba por pantalla el valor que hay en las posicion seleccionada, que no sé exactamente que tendría que escribir donde están los interrogantes.

Y una pequeña duda más. He leído que los destructores son llamados automáticamente por el compilador. ¿Hay alguna forma de controlar ésto? Porque lo que me suele pasar es que le doy a la opción de crear vector y me aparece escrito por pantalla "vector creado" y seguido "vector borrado". Es decir, me llama al destructor justo después.

Muchas gracias de antemano

Acermax

No sé si entiendo muy bien lo que pides, pero si es que te imprima el valor del vector de la posicion "posicion" sería en ese caso a[posicion], utilizando el operador [] que es para eso.

Obviamente, suponiendo que tienes bien hecho tu el operador [] con la "trampa" para cambiar la posición según el indice mínimo que le tengas puesto.

anon77

Cita de: Acermax en  2 Mayo 2011, 18:47 PM
No sé si entiendo muy bien lo que pides, pero si es que te imprima el valor del vector de la posicion "posicion" sería en ese caso a[posicion], utilizando el operador [] que es para eso.

Obviamente, suponiendo que tienes bien hecho tu el operador [] con la "trampa" para cambiar la posición según el indice mínimo que le tengas puesto.

Sí sí, es a eso a lo que me refiero. El operador [] lo tengo implementado para que funcione así y en un principio había puesto a[posicion] tal y como tú dices pero a la hora de compilarlo me ponía que a no estaba declarado.
Posiblemente será un error tonto pero repito que soy novato con c++ y aún me cuesta entenderlo  ;)

Acermax

A ver, el problema es que con ese trozo de código no puedo saber exactamente como lo haces.

IMAGINO que estás creando una clase llamada IArray que hereda de la clase vector de STL. En este caso STL utiliza 2 operadores [], uno para lectura y otro para escritura.


template <class T>
T & operator[]( int index )

template <class T>
const T & operator[]( int index ) const


Deberías implementar el operador [] que te falta, el constante. Internamente tiene que hacer exactamente lo mismo que el otro.

No sé si el problema vendrá por ahí, porque ya te digo, a la vista de ese código no veo nada más a simple vista.

anon77

Gracias por contestar otra vez Acermax. Lo de IArray es una cosa que se me ha colado de otro lado, ya lo he modificado.

A ver, el operador [] lo he hecho así:
int& Vector::operator[](int i)
{
  return data[ i ];
}
Con esto podría acceder en un principio de la forma a[4] por ejemplo.
Luego he implementado aparte un sencillo menu de este estilo:
scanf(&opcion);
while (opcion!=3){
  if (opcion==1) Vector a(sz);   //cogiendo con cin sz y tal
  else if (opcion==2){ cin>>pos; cout<< a[pos];}
  scanf(&opcion);
}
De esa forma cuando le meto un 1 me crearía el vector y con la opción 2 me mostraría el valor de las posición pos. Mi problema es que ahí me pone que a no está definido.
Espero que sea lo que me estabas pidiendo. Gracias otra vez

Acermax

Tal vez no lo esté entendiendo muy bien, pero si tu clase vector lo que usa son unos nuevos indice inferior y superior, no puedes devolver la posicion 'i' directamente, es decir, si tu creas, según tu clase, un vector de la forma: Vector (5,10) es un vector que los indices serían Vector[5], Vector[6],...,Vector[10], aunque internamente tu creas un Vector de la posición 0 a la 5.

Entonces tu operador [] debería ser de la forma


int& Vector::operator[](int i)
{
   return data[i-indice_min];
}


Y además te decía que para los vectores se usan 2 operadores iguales, que no estoy seguro si el error es por eso, pero implementalo porque es lo correcto. Uno se usa para la lectura del dato, es decir para hacer por ejemplo cout << Vector, y otro para la escritura: cin >> Vector, asi que deberías implementarlo así.


const int& Vector::operator[](int i) const
{
   return data[i-indice_min];
}


De todas maneras deberías poner el error exactamente que te da, a ver que dice el compilador.

anon77

El error de compilación me da en el menú, que es el que he puesto antes, en esta línea:
else if (opcion==2){ cin>>pos; cout<< a[pos];<<endl;}
Y el mensaje que me pone exactamente es este:
Error: 'a' was not declared in this scope

Acermax

#7
El vector debes crearlo fuera del IF, es muy probable que el error que dices sea ese, además que no tiene mucho sentido ese while para crear el vector. Crea al vector antes.

Tu problema viene a la hora de que no tienes en cuenta el alcance de las variables, en este caso la variable "a" local. Googleando un poco he encontrado una página que creo que lo dice más o menos clarillo: http://www.modelo.edu.mx/univ/virtech/prograc/cplus2.htm

Un saludo.

anon77

Solucionado! Era lo que tú decías. Muchas gracias Acermax