Perdón,<br><br>He repasado todo y en efecto funciona, os paso el código, consta del main.cpp y tres clases:<br><br><b>main.cpp:</b><br>#include <iostream><br>#include "AClass.h"<br>#include "BClass.h"<br>
<br>using namespace std;<br><br>int main()<br>{<br> const AClass* aClass = new AClass();<br> const BClass* bClass = new BClass();<br> aClass->setC(bClass->getC());<br> cout << "Hello world!" << endl;<br>
return 0;<br>}<br><b><br>AClass.h:</b><br>#ifndef ACLASS_H<br>#define ACLASS_H<br><br>// Fordward declaration<br>class CClass;<br><br>class AClass<br>{<br> public:<br> AClass();<br> ~AClass();<br> public:<br>
void setC(const CClass* C) const;<br> const CClass* getC();<br> private:<br> mutable const CClass* m_C;<br>};<br><br>#endif<br><br><b>AClass.cpp:</b><br>#include "AClass.h"<br><br>AClass::AClass()<br>
{<br>}<br><br>AClass::~AClass()<br>{<br>}<br><br>void AClass::setC(const CClass* C) const<br>{<br> m_C = C;<br>}<br><br>const CClass* AClass::getC()<br>{<br> return m_C;<br>}<br><br><b>BClass.h:</b><br>#ifndef BCLASS_H<br>
#define BCLASS_H<br><br>// Fordward declaration<br>class CClass;<br><br>class BClass<br>{<br> public:<br> BClass();<br> ~BClass();<br> public:<br> void setC(CClass* C);<br> CClass* getC() const;<br>
private:<br> CClass* m_C;<br>};<br><br>#endif<br><br><b>BClass.cpp:</b><br>#include "BClass.h"<br><br>BClass::BClass()<br>{<br>}<br><br>BClass::~BClass()<br>{<br>}<br><br>void BClass::setC(CClass* C)<br>
{<br> m_C = C;<br>}<br><br>CClass* BClass::getC() const<br>{<br> return m_C;<br>}<br><b><br>CClass.h:</b><br>#ifndef CCLASS_H<br>#define CCLASS_H<br><br>class CClass<br>{<br> public:<br> CClass();<br> ~CClass();<br>
public:<br> void setValue(int value);<br> int getValue();<br> private:<br> int m_value;<br>};<br><br>#endif<br><br><b>CClass.cpp:</b><br>#include "CClass.h"<br><br>CClass::CClass()<br>
{<br>}<br><br>CClass::~CClass()<br>{<br>}<br><br>void CClass::setValue(int value)<br>{<br> m_value = value;<br>}<br><br>int CClass::getValue()<br>{<br> return m_value;<br>}<br><br>Muchas gracias Steven, porque aunque conceptualmente y semánticamente es incorrecto viene muy bien para darse cuenta de cómo funciona 'const'.<br>
<br>Saludos.<br><br><div class="gmail_quote">El 15 de mayo de 2012 19:15, User <span dir="ltr"><<a href="mailto:usuarioanonimomysql@gmail.com" target="_blank">usuarioanonimomysql@gmail.com</a>></span> escribió:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Hola,<br><br>He probado lo de mutable y obtengo este error:<br><br><b>error: assignment of data-member 'myOtherClass::m_ myOtherObject' in read-only structure</b><br><br>He establecido el método 'setMember()' como constante y e indicado que el miembro a modificar sea
"mutable".<br><br>¿Por qué no lo permite si el atributo de la clase está declarado como mutable y el método es constante?<br><br>Saludos.<br><br><div class="gmail_quote">El 15 de mayo de 2012 12:01, User <span dir="ltr"><<a href="mailto:usuarioanonimomysql@gmail.com" target="_blank">usuarioanonimomysql@gmail.com</a>></span> escribió:<div>
<div class="h5"><br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hola,<br><br>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.<br>
<br>Saludos.<br>
<br><div class="gmail_quote">El 15 de mayo de 2012 03:15, Steven Davidson <span dir="ltr"><<a href="mailto:srd4121@njit.edu" target="_blank">srd4121@njit.edu</a>></span> escribió:<div><div><br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Hola User,<div><br>
<br>
On 5/14/2012 7:28 PM, User wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Hola,<br>
<br>
En efecto, 'other' es constante, no lo he puesto anres, pero es un<br>
parámetro constante del método 'myClass::doSomething()', El<br>
prototipo, por tanto, quedaría así: void myClass::doSomething(const<br>
myObjectType &myObject, const myOtherClass* other) const.<br>
<br>
La solución que propones me funciona, pero ¿se podrá hacer constante<br>
al método 'setMember()' y dejar constante al parámetro 'other'? Lo<br>
que quiero hacer en 'setMember()' es asignar el valor de<br>
'myObject.getMember()' a un miembro de la clase myOtherClass.<br>
<br>
</blockquote>
<br></div>
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:<br>
<br>
const int num = 10;<br>
<br>
num = 5;<br>
<br>
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.<br>
<br>
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,<br>
<br>
class myOtherClass<br>
{<br>
mutable int miembro;<br>
...<br>
};<br>
<br>
<br>
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.<br>
<br>
<br>
Espero que esto te oriente un poco.<div><div><br>
<br>
Steven<br>
<br>
<br>
______________________________<u></u>_________________<br>
Lista de correo Cconclase <a href="mailto:Cconclase@listas.conclase.net" target="_blank">Cconclase@listas.conclase.net</a><br>
<a href="http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net" target="_blank">http://listas.conclase.net/<u></u>mailman/listinfo/cconclase_<u></u>listas.conclase.net</a><span onmouseout="cancel = false; window.setTimeout(WRCHideContent, 1000); clearTimeout(showTimer);" onmouseover=" var self = this; showTimer = window.setTimeout(function(){WRCShowContent({'rating':{'value':-1,'weight':-1},'flags':{},'single':false,'ttl':7200,'expireTime':'20120515194601'}, self.className)},600);" class="wrc0" style="padding-right:16px;width:16px;height:16px"></span><span style="padding-right:16px;width:16px;min-height:16px"></span><span style="padding-right:16px;width:16px;min-height:16px"></span><br>
Bajas: <a href="http://listas.conclase.net/index.php?gid=2&mnu=FAQ" target="_blank">http://listas.conclase.net/<u></u>index.php?gid=2&mnu=FAQ</a><span onmouseout="cancel = false; window.setTimeout(WRCHideContent, 1000); clearTimeout(showTimer);" onmouseover=" var self = this; showTimer = window.setTimeout(function(){WRCShowContent({'rating':{'value':-1,'weight':-1},'flags':{},'single':false,'ttl':7200,'expireTime':'20120515194601'}, self.className)},600);" class="wrc0" style="padding-right:16px;width:16px;height:16px"></span><span style="padding-right:16px;width:16px;min-height:16px"></span><span style="padding-right:16px;width:16px;min-height:16px"></span><br>
</div></div></blockquote></div></div></div><br>
</blockquote></div></div></div><br>
</blockquote></div><br>