C/Visual C - casting usando operadores sobrecargados.

 
Vista:

casting usando operadores sobrecargados.

Publicado por Oliver++ (339 intervenciones) el 03/06/2003 14:53:40
Francamente el C++ me va a volver loco. :-)
no entiendo porqué el compilador hace cosas tan extrañas.
Mi inconveniente es con casting explícito usando sobrecarga de operadores. lo describo a continuación.

#define NUM_CARACTERES 12
class CCadena
{
public:
CCadena ()
{
cadena = new char [ NUM_CARACTERES ];
}

~CCadena () { delete [] cadena; }
void operator = ( CCadena& a );
void operator = ( const CCadena& a );

operator char* ()//este funciona
{
return cadena;
}

operator const char* ()//pero este no, PORQUE?
{
return cadena;
}

private:
char* cadena;

};
//esta implementación me da error
void CCadena::operator = ( const CCadena& a )
{
strcpy ( cadena, a );
}
//pero esta no
void CCadena::operator = ( CCadena& a )
{
strcpy ( cadena, a );
}

error C2664: 'strcpy' : cannot convert parameter 2 from 'const class CCadena' to 'const char *'
No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called
prueba archivos.exe - 1 error(s), 0 warning(s)

si tengo ambas converciones perfectamente definidas, PORQUE ME DICE QUE NO PUEDE HACER LA CONVERSIÓN?
he eliminado el resto de la implementación de la clase por simplificar el código, claro no pido que me resuelvan mi problema, solo que me ayuden... :-)
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:casting usando operadores sobrecargados.

Publicado por abi (54 intervenciones) el 03/06/2003 22:44:10
Hola! No se mucho sobre clases pero lo que no entiendo es porque declaras esta constante:

void operator = ( const CCadena& a );

si en ningún lado delcaras un dato constante ni la clase la declaras constante. A que te quieres referir con ese const ?
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:casting usando operadores sobrecargados.

Publicado por Oliver++ (339 intervenciones) el 04/06/2003 14:27:04
sucede que no voy a cambiar el valor del parámetro 'a' por eso lo paso constante y por eficiencia lo paso como referencia.
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:casting usando operadores sobrecargados.

Publicado por abi (54 intervenciones) el 04/06/2003 23:05:21
Hola! Y si en lugar de declarar la constante dentro de la función, asi:
void CCadena::operator = ( const CCadena& a )

si la declaras un objeto de la clase constante en el main y lo pasas por referencia, no te quitaria el error?, bueno no se mucho de clases y operadores pero me suena bastante raro pasar una clase constante si nunca la declaras constante (la clase).
Si lo que quieres es hacer una función que no cambie el valor de a porque no declaras una función constante.
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:casting usando operadores sobrecargados.

Publicado por chuidiang (677 intervenciones) el 05/06/2003 10:47:08
Abi, En el parámetro de la función se pone const cuando la función no va a tocar ese parámetro. No tiene nada que ver que fuera la declares o no constante, es simplemente indicar que la función no la va a cambiar.

Oliver, lo siento pero tu problema me desborda. He usado los operator cast, pero nunca lo he puesto lo de const. ¿Hay necesidad de ello?.

Sed buenos.
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:casting usando operadores sobrecargados.

Publicado por Oliver++ (339 intervenciones) el 05/06/2003 16:55:04
sucede que en algunas funciones voy a pasar el puntero de la variable miembro de la clase para cambiar su valor, pero en otras funciones no voy a cambiar nada. Por eso quiero que me devuelva un puntero constante al miembro.

int cambiarValor ( const char* );

en esta funcion si le paso el parametro me da un error diciento que no puede convertir la clase CCadena a const char*
pero si la implemento asi

int cambiarValor ( char* );

funciona perfectamente pero puedo cambiar accidentalmente el valor de la variable miembro.

lo que yo quiero es pasar el objeto de manera que el puntero me quede constante, COMO LO HAGO?
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: chuidang casting usando operadores

Publicado por abi (54 intervenciones) el 06/06/2003 04:36:26
Hola! gracias por tu correción, sólo que no me había dado cuenta de ese detalle, apenas estoy viendo sobrecarga de operadores y castings, y eso apenas lo vi ayer, (eso que me explicas del const que no tiene nada que ver con que declares un objeto const fuera de la clase)
Y pues yo tampoco he visto casting a const
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

ABI asting usando operadores sobrecargados.

Publicado por Oliver++ (339 intervenciones) el 05/06/2003 16:58:37
no necesariamente por el echo de no declarar un tipo de dato no constante, no se puede pasar constante a una funcion. Si quiero que la funcion cambie el valor de lo que sea menos el del parametro, debo definir su parametro constante. Si defino la funcion constate entonces no cambiara el valor de nadie.

gracias de todos modos. te agradezco tu ayuda.
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