¿Qué son las declaraciones Forward en C++?

Declaración directa se refiere a la declaración previa de la sintaxis o firma de un identificador, variable, función, clase, etc. antes de su uso (hecho más adelante en el programa). Ejemplo:

// Forward Declaration of the sum()
void sum(int, int);

// Usage of the sum
void sum(int a, int b)
{
    // Body
}

En C++, las declaraciones de avance se usan generalmente para las clases. En esto, la clase está predefinida antes de su uso para que pueda ser llamada y utilizada por otras clases definidas antes.

Ejemplo:

// Forward Declaration class A
class A;

// Definition of class A
class A{
    // Body
};

Necesidad de declaraciones anticipadas:

Entendamos la necesidad de una declaración directa con un ejemplo.

Ejemplo 1:

.
// C++ program to show
// the need for Forward Declaration
  
#include <iostream>
    using namespace std;
  
class B {
  
public:
    int x;
  
    void getdata(int n)
    {
        x = n;
    }
    friend int sum(A, B);
};
  
class A {
public:
    int y;
  
    void getdata(int m)
    {
        y = m;
    }
    friend int sum(A, B);
};
  
int sum(A m, B n)
{
    int result;
    result = m.y + n.x;
    return result;
}
  
int main()
{
    B b;
    A a;
    a.getdata(5);
    b.getdata(4);
    cout << "The sum is : " << sum(a, b);
    return 0;
}

Producción:

Compile Errors :
prog.cpp:14:18: error: 'A' has not been declared
   friend int sum(A, B);
                  ^

Explicación: Aquí el compilador arroja este error porque en la clase B se está usando el objeto de la clase A, el cual no tiene declaración hasta esa línea. Por lo tanto, el compilador no pudo encontrar la clase A. Entonces, ¿qué pasa si la clase A se escribe antes que la clase B? Averigüémoslo en el siguiente ejemplo.

Ejemplo 2:

.
// C++ program to show
// the need for Forward Declaration
  
#include <iostream>
    using namespace std;
  
class A {
public:
    int y;
  
    void getdata(int m)
    {
        y = m;
    }
    friend int sum(A, B);
};
  
class B {
  
public:
    int x;
  
    void getdata(int n)
    {
        x = n;
    }
    friend int sum(A, B);
};
  
int sum(A m, B n)
{
    int result;
    result = m.y + n.x;
    return result;
}
  
int main()
{
    B b;
    A a;
    a.getdata(5);
    b.getdata(4);
    cout << "The sum is : " << sum(a, b);
    return 0;
}

Producción:

Compile Errors :
prog.cpp:16:23: error: 'B' has not been declared
     friend int sum(A, B);
                       ^

Explicación: Aquí el compilador arroja este error porque en la clase A se está usando el objeto de la clase B, el cual no tiene declaración hasta esa línea. Por lo tanto, el compilador no pudo encontrar la clase B.

Ahora está claro que cualquiera de los códigos anteriores no funcionaría, sin importar en qué orden se escriban las clases. Por lo tanto, este problema necesita una nueva solución : declaración directa .

Agreguemos la declaración directa al ejemplo anterior y verifiquemos la salida nuevamente.

Ejemplo 3:

#include <iostream>
using namespace std;
  
// Forward declaration
class A;
class B;
  
class B {
    int x;
  
public:
    void getdata(int n)
    {
        x = n;
    }
    friend int sum(A, B);
};
  
class A {
    int y;
  
public:
    void getdata(int m)
    {
        y = m;
    }
    friend int sum(A, B);
};
int sum(A m, B n)
{
    int result;
    result = m.y + n.x;
    return result;
}
  
int main()
{
    B b;
    A a;
    a.getdata(5);
    b.getdata(4);
    cout << "The sum is : " << sum(a, b);
    return 0;
}
Producción:

The sum is : 9

El programa se ejecuta sin ningún error ahora. Una declaración directa le informa al compilador sobre la existencia de una entidad antes de definir realmente la entidad. Las declaraciones directas también se pueden usar con otras entidades en C++, como funciones, variables y tipos definidos por el usuario.

Publicación traducida automáticamente

Artículo escrito por SidharthSunil y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *