Asunto: Re: [CORBA-Comp] Warning con 'const'
Fecha: Mon Apr 3 18:50:38 2000
De: "Diego Sevilla Ruiz (dsevilla@um.es)" <dsevilla@ditec.um.es>
Hola, Emilio:
"Emilio Hernández Martín" wrote:
> Hola.
>
> Tengo un Warning relacionado con 'const' y con la inicialización del ORB que
> no sé muy bien cómo resolver.
>
> Tengo una función más o menos así:
>
> int Nombre_clase::Nombre_funcion ( const Clase_param ¶m )
> {
> ...
> String direccion = "mi dirección";
> direccion += ( param1.Cadena );
>
> int new_argc = 2;
> char **new_argv = new char*[new_argc+1];
>
> new_argv[0] = "-ORBNamingAddr";
> new_argv[1] = direccion; < WARNING AQUÍ.
> new_argv[2] = 0;
>
> myorb = CORBA::ORB_init( new_argc, new_argv, "mico-local-orb" );
> ...
> }
>
> Al compilar me dice:
>
> warning: conversion to `char *' from `const char *' discards const
>
Bien, la explicación no es complicada aunque si algo larga. En primer lugar ¿qué tipo es
String? Me refiero a que puedes especificar el tipo "string" en C++ ANSI, aunque si String
es una clase que tu tienes, hay que mirar su implementación. Aún así, haré algunas
suposiciones.
Al realizar la asignación, se tiene que hacer una conversión de "String" a "char*"
¿bien?. Sin embargo, esta conversión depende de cómo esté implementada la clase String:
Una clase String es normal que maneje internamente su almacenamiento (es decir, que se
encargue de hacer un "delete" de la cadena que contiene internamente). Cuando le pides que
te retorne su "almacenamiento interno", esto es, el puntero "C" a su cadena interna, no te
puede retornar un "char*", que permitiría que tu modificaras su contenido interno, sino un
"const char*" (esto es, un puntero a una cadena CONSTANTE). Si no te retornara un puntero
a una cadena constante, un cliente podría modificar el almacenamiento interno de la clase
(lo cual está en contra de los principios de encapsulamiento y abstracción). En otras
palabras, la clase String sólo tiene implementado el método:
operator const char* () { return ptr_; } // ptr_... o lo que sea su almacenamiento interno
La clase String también se podría implementar de otra manera en la que ofreciera una
operación "char*":
operator char* () { ... }
Pero esta operación TENDRÍA QUE RETORNAR UN DUPLICADO DE SU ALMACENAMIENTO INTERNO y
retornar un puntero al duplicado. Este duplicado se encarga de liberarlo el cliente, como
es natural.
Por lo que parece, tu clase String es del primer tipo, con lo que la implementación de la
copia la debes hacer tu mismo:
// 1ª solución (más elegante)
new_argv[2] = new char[direccion.length()+1];
strcpy(new_argv[2],direccion);
// hacer la llamada...
// Y finalmente, hacer un ...
delete new_argv[2];
Aunque es posible que la operación "strcpy" lance otro "Warning" exactamente igual, ya que
puede estar definida, si utilizas un compilador algo antiguo como que requiere un "char*"
en vez de un "const char*", como debería ser. En fin... así es la vida.
La segunda opción menos eleganes es hacer el cast explícito:
new_argv[2] = (char*)direccion;
Con esto tampoco hay Warning (creo), aunque "tampoco" se está haciendo bien.
UN ÚLTIMO CONSEJO: No utilices directamente new_argv[0], ya que normalmente en esa
posición está el nombre del ejecutable. El código del ORB puede tranquilamente empezar a
considerar los argumentos desde new_argv[1] sin romper el contrato y tu código no
funcionaría. Bien copia el primer elemento de tu propio argv o bien introduce en
new_argv[0] alguna cadena no vacía.
>
> No puedo declarar "new_argv" como 'const' porque si no me da error en la
> llamada a ORB_init() y aunque cambie el
> parámetro de entrada y le quite el "const" me sigue dando el Warning porque
> (creo) el método += de String
> transforma la cadena en 'const' (o algo así).
>
> ¿Cómo podría solucionar este Warning?
>
> Muchas gracias.
>
> Emilio.
>
Espero que esto te ayude.
Saludos.
diego.
--
Diego Sevilla Ruiz -- http://www.ditec.um.es/~dsevilla/
Departamento de Ingeniería y Tecnología de Computadores
Facultad de Informática. Universidad de Murcia
Campus de Espinardo - 30080 Murcia (SPAIN)
Tel.: +34-968-367570
E-mail: dsevilla@ditec.um.es
$_="\\l/) (>". "_'\n<";@@= /.|\n/g;$_=
"\@". "\007f". "DDq". "DD5". "\204".
"\@". "DT4CE". "D54E". "DD". "\244".
"\021". "dBDTC". "\010DD". "\200\$FD\024".
"GDAG". "DAGDT". "CqI";$c =0;$p =5;for$q
(/./g) {$q= ord$q; for(a, b){$z[$c]
=$@[$p+=($q&15) -4];$q>>=4;$c+=33 ;$c>98 &&($c-=98);}};print@z;
--------------------------------------------------------------------------
Esta es la lista de discusión de CORBA y Componentes Software (corba-comp)
--------------------------------------------------------------------------
Suscripcion: Envie un correo a mailto:Majordomo@ditec.um.es?body=subscribe%20corba-comp
Eliminar su suscripcion: mailto:Majordomo@ditec.um.es?body=unsubscribe%20corba-comp
Informacion de la lista: mailto:Majordomo@ditec.um.es?body=info%20corba-comp
Problemas: mailto:corba-comp-owner@ditec.um.es
Indices de la lista: http://www.ditec.um.es/~dsevilla/corba/
--------------------------------------------------------------------------