2011-02-15 15 views
18

Tengo una función legado que se parece a esto:Cómo llamar a una función no constante dentro de una función const (C++)

int Random() const 
{ 
    return var_ ? 4 : 0; 
} 

y tengo que llamar a una función dentro de ese código heredado de modo que ahora se ve 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 conozco el fin de fijar Thi s error Puedo hacer que mi newCall() sea una función const. Pero luego tengo varias llamadas de funciton en newCall() que tengo que hacer, así que ahora tendría que hacer todas esas llamadas de función const. Y así sucesivamente hasta que finalmente siento que la mitad de mi programa va a ser const.

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 la mitad de mi programa const.

Gracias

-Josh

+0

Puede hacer que Random() no const. – GWW

+0

Me gustaría pero Random() es un código heredado que realmente no puedo tocar. – Grammin

+1

Es ese 4 elegido con un dado imparcial (lo que lo hace realmente aleatorio). –

Respuesta

17

que debe modificar su programa para usar/declarar const correctamente ...

una alternativa es utilizar const_cast.

+2

+1: Si puede, realice todas las funciones dependientes 'const'. –

+5

El uso de const_cast de forma incorrecta (que es lo que sucederá) hará que se produzca un desastre completo. –

+3

Gracias por el consejo, terminé cambiando las funciones debajo de newCall() y newCall() para que todo sea const, porque no quería usar const incorrectamente. – Grammin

0
const_cast<MyClass *>(this)->newCall(4) 

Sólo haga esto si está seguro NvaLlam no modificará "este".

12
int Random() const 
{ 
    return var_ ? const_cast<ClassType*>(this)->newCall(4) : 0; 
} 

Pero no es una buena idea. ¡Evita si es posible!

+1

@Downvoter: explique por qué downvote? – Nawaz

+0

Como dijo, si realmente necesita usar 'const_cast' para lograr esto, intente refactorizar su diseño. – thatWiseGuy

0

Sin usar const cast, ¿podría intentar crear una nueva instancia de la clase en el método Random()?

0

El calificador const afirma que la instancia this de la clase no se modificará después de la operación, algo que el compilador no puede deducir automáticamente.

const_cast podrían utilizarse pero su mal

1

Hay dos posibilidades aquí. Primero, newCall y TODAS sus calles son de hecho funciones no modificantes. En ese caso, debe pasar y marcarlos todos const. Tanto usted como el futuro mantenedor de códigos le agradecerán que le haya facilitado la lectura del código (a partir de su experiencia personal aquí). En segundo lugar, newCall HACE de hecho mutar el estado de su objeto (posiblemente a través de una de las funciones que llama). En este caso, debe romper la API y hacer Random no const para indicar correctamente a las personas que llaman que modifica el estado del objeto (si las modificaciones solo afectan la constness física y no la lógica, puede usar atributos mutables y propagar const).

0

si es realmente un generador de números aleatorios, entonces el código/estado de generación de números podría colocarse en un generador estático de clase local. de esta forma, tu objeto no está mutado y el método puede seguir siendo const.

+0

No es un generador de números aleatorios. Solo necesitaba un ejemplo para SO. Gracias de cualquier forma – Grammin

Cuestiones relacionadas