C/Visual C - ¿Cómo trato esta excepción?

 
Vista:

¿Cómo trato esta excepción?

Publicado por BluSky (28 intervenciones) el 11/08/2003 13:59:27
Ya tengo bastante claro el uso de las excepciones en C++. Estoy, por ello, realizando un programa que hace uso de ellas pero no sé tratar una. Os cuento:
Tengo creada una clase CVector que simula un Vector de enteros con las operaciones de añadir elementos,quitar elementos y mostrar los valores contenidos en él.
He creado, además, una clase CError para tratar las posibles excepciones que puedieran darse en las operaciones antes citadas; de manera que, cuando puede suceder un error, lanzo una excepción de tipo CError con un código (1, 2, ...) según el fallo dado; para esto he diseñado una función miembro de CError que actúa en consecuencia en función del Tipo de Error eníado. Hasta ahí todo bien... pero tengo un problema cuando lanzo la excepción correspondiente a Vector lleno... en este caso, lo que pretendo, es pedir más memoria para el vector através de un puntero auxiliar al cual copio todo el contenido del vector actual etc etc etc pero... esto lo tengo que hacer desde la función TratarError de la clase CError y, evidentemente, desde esta clase no puedo acceder a los miembros de CVector para realizar las operaciones anteriores.
He intentado lanzar una excepción del tipo: throw Error(1, V) y, para ello, he creado un constructor que admita un entero y un objeto de la clase Cvector pero tengo problemas de compilación.
Espero haber sabido explicarme. ¿Se os ocurre alguna idea sobre cómo puedo hacer esta operación desde la clase CError?
Saludos y perdon por el rollo
Sebas
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:¿Cómo trato esta excepción?

Publicado por chuidiang (677 intervenciones) el 11/08/2003 16:44:06
¿Cual es el error de compilacion que obtienes?

Intento adelantarme, aunque a lo mejor no es esto lo que te pasa.

Si CVector.h incluye Error.h y Error.h incluye CVector.h puedes tener problemas de compilado. Para evitar esto se hace que:

Error.h incluye Vector.h, puesto que el constructor contiene un parametro Vector y para el prototipo del constructor de Error necesitas Vector.
Vector.h entiendo que no necesita Error.h. No hay ningun prototipo de metodo ni constructor de Vector.h que devuelva o tenga como parametro un Error. Puedes poner el include de Error.h dentro de Vector.c. De esta forma evitas el error de compilado y Vector ve a Error donde lo necesita, que es en el codigo (el .c), donde construye un Error para lanzarlo (throw).

Si Vector.h necesitar error.h y error.h necesita vector.h, posiblemente deberías revisar el diseño. No es bueno que la interface de una clase vea a la otra y la otra a la una. De todas formas, si tiene que ser asi, hay un pequeño truco:

Fichero Vector.h (de forma normal)
#include <Error.h>
class Vector
{
...
}

Fichero error.h

class Vector; /* Se indica que hay una clase que se llama Vector, pero que se declarará más adelante.*/
class Error
{
public:
Error (int a, Vector v);
...
}

y luego en Error.c pones el include de vector.h

Se bueno.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:¿Cómo trato esta excepción?

Publicado por BluSky (28 intervenciones) el 11/08/2003 20:56:31
Gracias, de nuevo, por tu disposición Chuidiang. Te comento.
El programa está en un único módulo por lo que no debería ser problema de los "includes". Te pego una parte del código:
class Vector;
class Error
{
int TipoError;
public:
Error(int n) {TipoError=n;};
Error(int n, Vector V);
void TratarError();
};

void Error::TratarError()
{
switch (TipoError)
{

/**** ME FALTA EL CASE 1 QUE ES QUIEN TRATA EL CASO DE QUE NO QUEPA *********/

case 2:printf ("NO HAS INTRODUCIDO LETRA MINUSCULA");
break;
case 3:printf("EL VECTOR ESTA VACIO");
break;
}
}

La clase Vector (en el mismo módulo):
class Vector
{
int MaxElementos;
char *V;
int Elementos;
public:
Vector();
void Meter() throw (Error);
void Sacar() throw (Error);
void Mostrar() throw (Error);
};

Y la función "METER" que introduce un elemento en el vector:
void Vector::Meter() throw (Error)
{
char Letra;
try {
cin >> Letra;

if ((Letra>='a') && (Letra<='z'))
if (Elementos>MaxElementos)
/***** ESTA ES LA EXCEPCIÓN QUE ME INTERESA*******/
//Construyo un objeto Error con el código de error y le envío el objeto //actual para modificarlo en la clase Error. Aquí vienen mis problemas: Si envio this, el compilad
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:¿Cómo trato esta excepción?

Publicado por BluSky (28 intervenciones) el 11/08/2003 21:09:06
Te reenvio la función METER, que quedó cortada:
void Vector::Meter() throw (Error)
{
char Letra;
try {
cin >> Letra;

if ((Letra>='a') && (Letra<='z'))
if (Elementos>MaxElementos)

//ESTA ES LA EXCEPCION QUE ME INTERESA:

throw Error(1, *this); // NO CABE EN EL VECTOR

Como ves, pretendo construir un objeto Error junto con el Vector actual con objeto de poderlo modificar de la clase CError. Obviamente, si no, ela clase CVector está inaccesible en CError. ¿Sería así?. Como habrás visto, tengo hecho un constructor que recibe un entero y un Vector pero da problemas.... Si envío *this (creo recordar) en el constructor de CError me dice que no existe la estructura CVector¿? y si envio this me dice que no puede ser modificado. ¿Cómo se te ocurre que pueda hacerlo?. ¿Acaso tendría que tratar esa excepción en el propio "catch" de CVector?
Te agradecería un poco de luz
Gracias
Sebas

Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:¿Cómo trato esta excepción?

Publicado por BluSky (28 intervenciones) el 11/08/2003 21:10:45
Te reenvio la función METER, que quedó cortada:
void Vector::Meter() throw (Error)
{
char Letra;
try {
cin >> Letra;

if ((Letra>='a') && (Letra<='z'))
if (Elementos>MaxElementos)

//ESTA ES LA EXCEPCION QUE ME INTERESA:

throw Error(1, *this); // NO CABE EN EL VECTOR

Como ves, pretendo construir un objeto Error junto con el Vector actual con objeto de poderlo modificar de la clase CError. Obviamente, si no, ela clase CVector está inaccesible en CError. ¿Sería así?. Como habrás visto, tengo hecho un constructor que recibe un entero y un Vector pero da problemas.... Si envío *this (creo recordar) en el constructor de CError me dice que no existe la estructura CVector¿? y si envio this me dice que no puede ser modificado. ¿Cómo se te ocurre que pueda hacerlo?. ¿Acaso tendría que tratar esa excepción en el propio "catch" de CVector?
Te agradecería un poco de luz
Gracias
Sebas

Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:¿Cómo trato esta excepción?

Publicado por BluSky (28 intervenciones) el 11/08/2003 21:17:32
Te reenvio la función METER, que quedó cortada:
void Vector::Meter() throw (Error)
{
char Letra;
try {
cin >> Letra;

if ((Letra>='a') && (Letra<='z'))
if (Elementos>MaxElementos)

//ESTA ES LA EXCEPCION QUE ME INTERESA:

throw Error(1, *this); // NO CABE EN EL VECTOR

Como ves, pretendo construir un objeto Error junto con el Vector actual con objeto de poderlo modificar de la clase CError. Obviamente, si no, ela clase CVector está inaccesible en CError. ¿Sería así?. Como habrás visto, tengo hecho un constructor que recibe un entero y un Vector pero da problemas.... Si envío *this (creo recordar) en el constructor de CError me dice que no existe la estructura CVector¿? y si envio this me dice que no puede ser modificado. ¿Cómo se te ocurre que pueda hacerlo?. ¿Acaso tendría que tratar esa excepción en el propio "catch" de CVector?
Te agradecería un poco de luz
Gracias
Sebas

Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:¿Cómo trato esta excepción?

Publicado por chuidiang (677 intervenciones) el 12/08/2003 09:51:00
He hecho este programita

class A;
class B{
public:
B (A unA){}
};
class A {
public:
void funcion() throw (B) {
throw B(*this);
}
};
void main(int argc, char* argv[]) {
A a;
a.funcion();
}

Es similar a lo que tu quieres. En unix me compila y funciona perfectamente. En Visual C++ obtengo un error (que no es el mismo que obtienes tu) y tengo que hacer el siguiente cambio

class A;
class B {
public:
B (A *unA) { // Admite un puntero como parametro
}
};
class A {
public:
void funcion() throw (B) {
throw B(this); // Paso this en vez de *this
}
};
void main(int argc, char* argv[])
{
A a;
a.funcion();
}

Me parece que estamos en un punto que depende un poco del compilador que estemos usando, asi que tendrás que investigar un poco el tema (¿Qué compilador usas?). Prueba si quieres a pasar un puntero a Vector en el constructor de Error como en mi segundo programita, a ver si tienes suerte.

Se bueno.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:¿Cómo trato esta excepción?

Publicado por BluSky (28 intervenciones) el 12/08/2003 14:40:50
Pues entre ésta y la otra contestación veo que, como me comentas, es problema de precedencias en la declaración de clases. Creo que lo tengo pillado ya. He añadido a la clase Error un puntero a Vector para que recoja el objeto que provoca la excepción y con ese puntero "toco" los miembros originales. Ando en pruebas todavía pero ahora, por lo menos, han "desaparecido" los errores.
Muchísimas gracias chuidiang.
Sebas
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar