Referencia indefinida a Class::Function() en C++

Muhammad Husnain 12 octubre 2023
  1. Tipos de errores en C++
  2. Referencia indefinida a una Clase::Función() en C++
  3. Resolver una referencia indefinida a una Clase::Función() debido a que no hay definición de función en C++
  4. Resolver una referencia indefinida a una Clase::Función() debido a archivos de objetos no vinculados en C++
  5. Resolver una referencia indefinida a una Clase::Función() debido a archivos dependientes no compilados en C++
Referencia indefinida a Class::Function() en C++

Este tutorial analiza brevemente uno de los errores más comunes e igualmente críticos en la programación de C++ (es decir, la referencia indefinida a una Clase::Función()).

Primero, discutiremos brevemente diferentes errores al codificar en C++. Luego, explicaremos las causas y las soluciones para el error de referencia indefinido.

Tipos de errores en C++

Los códigos C++ pueden estar sujetos a errores o fallas por múltiples razones como cualquier otro lenguaje de programación. Estos errores se clasifican en términos generales en las siguientes categorías de error:

  • Errores de sintaxis son los errores que ocurren debido a violaciones en las reglas de C++ o cualquier sintaxis.
  • Los Errores en tiempo de ejecución son los errores que se producen cuando no hay problema de programación sintácticamente pero se detectan en el momento de la ejecución y provocan un bloqueo del programa.
  • Los Errores lógicos se producen cuando no obtenemos los resultados o resultados deseados, lo que significa que hay errores en la lógica de nuestro programa.
  • Los Errores del enlazador son el tipo de errores cuando el programa se compila con éxito y está intentando enlazar algunos otros objetos con nuestro archivo de objeto principal y, por lo tanto, no se genera el ejecutable. Por ejemplo, cualquier prototipo incorrecto de la función definida, cualquier archivo de encabezado incorrecto incluido, etc.

Referencia indefinida a una Clase::Función() en C++

Este es el error que ocurre con más frecuencia en C++ y es igualmente crítico, especialmente para los nuevos programadores. Este tipo de error del enlazador puede afectar la ejecución del programa.

Estos errores ocurren principalmente cuando el programa se compila correctamente y se encuentra en la fase de vinculación tratando de vincular otros archivos de objetos con el objeto principal. Hay algunos casos en los que el programa da algún resultado y se produce este error.

Por lo tanto, a veces es complicado rastrear y corregir tales errores.

El error de referencia indefinida se produce cuando hemos utilizado alguna referencia a alguna clase, función o variable. El enlazador no puede encontrar su definición en todos los archivos y bibliotecas de objetos enlazados, generando así el error Referencia no definida a una clase:: Función().

Puede haber varias causas de estos errores, pero discutiremos algunas de ellas aquí.

Resolver una referencia indefinida a una Clase::Función() debido a que no hay definición de función en C++

Esta puede ser la razón más sencilla de este error, que proporcionó el prototipo de la función pero olvidó dar su definición.

Cuando creas una referencia para esa función, el enlazador no podrá encontrar su definición, generando así un error Undefined Reference to a Class::Function().

Esto se demuestra en el siguiente ejemplo:

#include <iostream>
class Square {
 public:
  double length;  // Length of a box
  double width;   // Breadth of a box
  double height;  // Height of a box

  double getArea(void);
};
int main() {
  Square sq1;
  sq1.getArea();
  return 0;
}

Producción :

(.text+0x15): undefined reference to Square::getArea()
collect2.exe: error: ld returned 1 exit status

Resolver una referencia indefinida a una Clase::Función() debido a archivos de objetos no vinculados en C++

Cuando usamos un archivo diferente para definir una clase, necesitamos incluir ese archivo en el archivo de función principal para vincularlo con el archivo de objeto principal al vincular el programa.

En el siguiente ejemplo, definimos la clase Cuadrado por separado en otro archivo. En el archivo principal, estamos haciendo referencia a su objeto, por lo que dará un error de referencia indefinido ya que el archivo no está vinculado.

Ejemplo:

#include <iostream>
using namespace std;

int main() {
  Square sq1;
  cout << sq1.getArea();
  return 0;
}

Ejemplo (Cuadrado.cpp):

class Square {
 public:
  double length;  // Length of a box
  double width;   // Breadth of a box
  double height;  // Height of a box
  double getArea(void) { return length * width; }
  void setLength(double l) { length = l; }
};

La solución a este problema es vincular el archivo Square.cpp al archivo principal en el siguiente código.

#include <iostream>

#include "square.cpp"
using namespace std;

int main() {
  Square sq1;
  cout << sq1.getArea();
  return 0;
}

Resolver una referencia indefinida a una Clase::Función() debido a archivos dependientes no compilados en C++

Este tipo de error también ocurre cuando todas las dependencias del programa no se compilan correctamente. Para que un enlazador genere un ejecutable con éxito, es necesario compilar todas las dependencias antes de iniciar la fase de enlace.

Esto es inevitable para que el enlazador pueda encontrar fácilmente todos los archivos de objetos dependientes (es decir, archivos .o). Si falta algún archivo de objeto dependiente, el enlazador generará un error de referencia indefinida.

Nota
Si usa el compilador g++ de GNU, el comando Bash g++ -c abc.cpp generará un archivo de objeto correspondiente abc.o sin invocar el enlazador.

Además de las situaciones discutidas anteriormente, puede haber muchas otras situaciones para el error de referencia indefinido. El programador debe definir correctamente todos los identificadores (por ejemplo, funciones, variables y objetos) para evitar tales problemas.

Muhammad Husnain avatar Muhammad Husnain avatar

Husnain is a professional Software Engineer and a researcher who loves to learn, build, write, and teach. Having worked various jobs in the IT industry, he especially enjoys finding ways to express complex ideas in simple ways through his content. In his free time, Husnain unwinds by thinking about tech fiction to solve problems around him.

LinkedIn

Artículo relacionado - C++ Error