[C con Clase] passing 'const ...' as 'this' argument of 'void ...' discards qualifiers

User usuarioanonimomysql en gmail.com
Mar Mayo 15 19:15:05 CEST 2012


Hola,

He probado lo de mutable y obtengo este error:

*error: assignment of data-member 'myOtherClass::m_ myOtherObject' in
read-only structure*

He establecido el método 'setMember()' como constante y e indicado que el
miembro a modificar sea "mutable".

¿Por qué no lo permite si el atributo de la clase está declarado como
mutable y el método es constante?

Saludos.

El 15 de mayo de 2012 12:01, User <usuarioanonimomysql en gmail.com> escribió:

> Hola,
>
> Es sólo para aprender el uso de const y para dominarlo bien. ¿Me podrías
> poner un ejemplo de eliminar la parte de 'const' temporalmente a través de
> 'const_cast'? Probaré lo de mutable.
>
> Saludos.
>
> El 15 de mayo de 2012 03:15, Steven Davidson <srd4121 en njit.edu> escribió:
>
> Hola User,
>>
>>
>> On 5/14/2012 7:28 PM, User wrote:
>>
>>> Hola,
>>>
>>> En efecto, 'other' es constante, no lo he puesto anres, pero es un
>>> parámetro constante del método 'myClass::doSomething()', El
>>> prototipo, por tanto, quedaría así: void myClass::doSomething(const
>>> myObjectType &myObject, const myOtherClass* other) const.
>>>
>>> La solución que propones me funciona, pero ¿se podrá hacer constante
>>> al método 'setMember()' y dejar constante al parámetro 'other'? Lo
>>> que quiero hacer en 'setMember()' es asignar el valor de
>>> 'myObject.getMember()' a un miembro de la clase myOtherClass.
>>>
>>>
>> Como he dicho antes, no tiene sentido que invoques 'setMember()', la cual
>> por su nombre significa que vas a modificar un miembro de "este objeto",
>> con un objeto constante. Es como intentar hacer esto:
>>
>> const int num = 10;
>>
>> num = 5;
>>
>> Aparte de ser semánticamente incorrecto, también es una operación
>> ilógica. Por eso te menciono que revises el diseño de lo que quieres hacer.
>> Personalmente, si vas a modificar un objeto que es constante, entonces
>> significa que no tienes las ideas claras.
>>
>> Ahora bien, hay otra forma de saltarse toda esta lógica, que es
>> eliminando la parte de 'const' temporalmente a través de 'const_cast'. La
>> otra solución es la de establecer que 'setMember()' sea constante - cosa
>> que estoy MUY en contra porque no tiene sentido alguno - pero indicar que
>> ese miembro a modificar sea "mutable". Por ejemplo,
>>
>> class myOtherClass
>> {
>>  mutable int miembro;
>>  ...
>> };
>>
>>
>> Reitero que debes pensar MUY bien lo que quieres hacer, ya que si 'other'
>> es constante, no tiene sentido modificarlo, y si se debe modificar,
>> entonces no debería ser constante.
>>
>>
>> Espero que esto te oriente un poco.
>>
>>
>> Steven
>>
>>
>> ______________________________**_________________
>> Lista de correo Cconclase Cconclase en listas.conclase.net
>> http://listas.conclase.net/**mailman/listinfo/cconclase_**
>> listas.conclase.net<http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net>
>> Bajas: http://listas.conclase.net/**index.php?gid=2&mnu=FAQ<http://listas.conclase.net/index.php?gid=2&mnu=FAQ>
>>
>
>
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20120515/9078b927/attachment.html>


Más información sobre la lista de distribución Cconclase