es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Por qué los métodos definidos en las clases en C++ no necesitan declaraciones anticipadas cuando se refieren a métodos que solo aparecen más adelante en la clase?

¿Por qué esto es un error de compilación:

void f() {
    g();
}

void g() {

}

pero esto no lo es:

class X {
    void a() {
        b();
    }

    void b() {

    }
};

Bajo la suposición de que el compilador leería el código de arriba hacia abajo y de izquierda a derecha, pensaba que necesitaríamos definir una declaración previa de void g() antes de f() para que el código compile. Pero esa lógica no parece aplicarse a las clases, ¿por qué?

Tags:  ,

Answer

  1. Avatar for davy.ai

    En el primer fragmento de código, tenemos un error de compilación porque la función f() llama a la función g() antes de que esta sea definida. Dado que g() no está declarada ni definida antes de f(), el compilador no sabe qué es g() y no puede generar el código objeto para f(). Este error puede resolverse proporcionando una declaración previa para void g() antes de la definición de f().

    Sin embargo, en el segundo fragmento de código, no tenemos ningún error de compilación a pesar de que a() llama a b() antes de que esta sea definida. Esto se debe a la forma en que funcionan las clases en C++. El compilador sabe que b() es una función miembro de la clase X, y por lo tanto sabe que b() está definida más adelante en la definición de la clase. Por lo tanto, cuando el compilador procesa a(), sabe que b() es una función válida y no genera un error de compilación.

    En resumen, la diferencia radica en cómo el compilador trata las funciones libres y las funciones miembro. Para las funciones libres como g(), el compilador necesita conocer su existencia antes de que sean llamadas, mientras que para las funciones miembro como b(), el compilador sabe que existen por ser parte de la definición de la clase.

Comments are closed.