¿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é?
davy.ai
En el primer fragmento de código, tenemos un error de compilación porque la función
f()
llama a la funcióng()
antes de que esta sea definida. Dado queg()
no está declarada ni definida antes def()
, el compilador no sabe qué esg()
y no puede generar el código objeto paraf()
. Este error puede resolverse proporcionando una declaración previa paravoid g()
antes de la definición def()
.Sin embargo, en el segundo fragmento de código, no tenemos ningún error de compilación a pesar de que
a()
llama ab()
antes de que esta sea definida. Esto se debe a la forma en que funcionan las clases en C++. El compilador sabe queb()
es una función miembro de la claseX
, y por lo tanto sabe queb()
está definida más adelante en la definición de la clase. Por lo tanto, cuando el compilador procesaa()
, sabe queb()
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 comob()
, el compilador sabe que existen por ser parte de la definición de la clase.