Cómo llamar a una función no constante dentro de una función const(C++)
function const-correctness (7)
El calificador const
afirma que la instancia de this
clase no se modificará después de la operación, algo que el compilador no puede deducir automáticamente.
const_cast
podría usar const_cast
pero su maldad
Tengo una función heredada que se ve así:
int Random() const
{
return var_ ? 4 : 0;
}
y necesito llamar a una función dentro de ese código heredado para que ahora se vea así:
int Random() const
{
return var_ ? newCall(4) : 0;
}
El problema es que estoy recibiendo este error:
In member function ''virtual int Random() const'':
class.cc:145: error: passing ''const int'' as ''this'' argument of ''int newCall(int)'' discards qualifiers
Ahora sé que para corregir este error puedo hacer que mi newCall()
una función constante. Pero luego tengo varias llamadas a newCall()
en newCall()
que tengo que hacer, así que ahora tendría que hacer que todas esas llamadas a funciones sean constantes. Y así sucesivamente, hasta que, finalmente, siento que la mitad de mi programa será constante.
Mi pregunta: ¿hay alguna forma de llamar a una función dentro de Random () que no sea const? ¿O alguien tiene alguna idea sobre cómo implementar newCall()
dentro de Random()
sin hacer que la mitad de mi programa sea constante?
Gracias
-josh
Hay dos posibilidades aquí. En primer lugar, newCall
y TODOS sus destinatarios son, de hecho, funciones no modificables. En ese caso, absolutamente debe pasar y marcarlos todos const
. Tanto usted como los futuros mantenedores de código le agradecerán que sea mucho más fácil leer el código (hablando desde su experiencia personal aquí). En segundo lugar, newCall
, de hecho, muta el estado de su objeto (posiblemente a través de una de las funciones a las que llama). En este caso, debe romper la API y hacer que Random
no sea constante para indicar adecuadamente a las personas que llaman que modifica el estado del objeto (si las modificaciones solo afectan la constancia física y no la constancia lógica, puede usar atributos mutables y propagar const
).
Si realmente es un generador de números aleatorios, entonces el código / estado de generación de números probablemente se colocará en un generador estático de clase local. De esta manera, su objeto no está mutado y el método puede permanecer constante.
Sin usar const cast, ¿podría intentar crear una nueva instancia de la clase en el método Random()
?
Debes alterar tu programa para usar / declarar const correctamente ...
Una alternativa es usar const_cast.
const_cast<MyClass *>(this)->newCall(4)
Solo haga esto si está seguro de que newCall no modificará "esto".
int Random() const
{
return var_ ? const_cast<ClassType*>(this)->newCall(4) : 0;
}
Pero no es una buena idea. ¡Evita si es posible!