[C con Clase] passing 'const ...' as 'this' argument of 'void ...' discards qualifiers
User
usuarioanonimomysql en gmail.com
Mar Mayo 15 20:21:33 CEST 2012
Perdón,
He repasado todo y en efecto funciona, os paso el código, consta del
main.cpp y tres clases:
*main.cpp:*
#include <iostream>
#include "AClass.h"
#include "BClass.h"
using namespace std;
int main()
{
const AClass* aClass = new AClass();
const BClass* bClass = new BClass();
aClass->setC(bClass->getC());
cout << "Hello world!" << endl;
return 0;
}
*
AClass.h:*
#ifndef ACLASS_H
#define ACLASS_H
// Fordward declaration
class CClass;
class AClass
{
public:
AClass();
~AClass();
public:
void setC(const CClass* C) const;
const CClass* getC();
private:
mutable const CClass* m_C;
};
#endif
*AClass.cpp:*
#include "AClass.h"
AClass::AClass()
{
}
AClass::~AClass()
{
}
void AClass::setC(const CClass* C) const
{
m_C = C;
}
const CClass* AClass::getC()
{
return m_C;
}
*BClass.h:*
#ifndef BCLASS_H
#define BCLASS_H
// Fordward declaration
class CClass;
class BClass
{
public:
BClass();
~BClass();
public:
void setC(CClass* C);
CClass* getC() const;
private:
CClass* m_C;
};
#endif
*BClass.cpp:*
#include "BClass.h"
BClass::BClass()
{
}
BClass::~BClass()
{
}
void BClass::setC(CClass* C)
{
m_C = C;
}
CClass* BClass::getC() const
{
return m_C;
}
*
CClass.h:*
#ifndef CCLASS_H
#define CCLASS_H
class CClass
{
public:
CClass();
~CClass();
public:
void setValue(int value);
int getValue();
private:
int m_value;
};
#endif
*CClass.cpp:*
#include "CClass.h"
CClass::CClass()
{
}
CClass::~CClass()
{
}
void CClass::setValue(int value)
{
m_value = value;
}
int CClass::getValue()
{
return m_value;
}
Muchas gracias Steven, porque aunque conceptualmente y semánticamente es
incorrecto viene muy bien para darse cuenta de cómo funciona 'const'.
Saludos.
El 15 de mayo de 2012 19:15, User <usuarioanonimomysql en gmail.com> escribió:
> 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/e48c4b12/attachment-0001.html>
Más información sobre la lista de distribución Cconclase