[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