Référence non définie à Class::Function() en C++
- Types d’erreurs en C++
-
Référence indéfinie à une
Class::Function()
en C++ -
Résoudre une référence indéfinie à une
Class::Function()
en raison de l’absence de définition de fonction en C++ -
Résoudre une référence indéfinie à une
Class::Function()
en raison de fichiers d’objets non liés en C++ -
Résoudre une référence indéfinie à une
Class::Function()
due à des fichiers dépendants non compilés en C++
Ce didacticiel décrit brièvement l’une des erreurs les plus courantes et tout aussi critiques dans la programmation C++ (c’est-à-dire, la référence indéfinie à une Classe :: Fonction()
).
Tout d’abord, nous discuterons brièvement des différentes erreurs lors du codage en C++. Ensuite, nous expliquerons les causes et les correctifs de l’erreur de référence indéfinie.
Types d’erreurs en C++
Les codes C++ peuvent être sujets à des erreurs ou des bogues pour de multiples raisons comme tout autre langage de programmation. Ces erreurs sont généralement classées dans les catégories d’erreurs suivantes :
- Les
Erreurs de syntaxe
sont les erreurs qui se produisent en raison de violations des règles de C++ ou de toute syntaxe. - Les
Erreurs d'exécution
sont les erreurs qui se produisent lorsqu’il n’y a pas de problème de programmation syntaxiquement mais qui sont détectées au moment de l’exécution et entraînent un plantage du programme. - Des
erreurs logiques
se produisent lorsque nous n’obtenons pas les résultats ou la sortie souhaités, ce qui signifie qu’il y a des erreurs dans la logique de notre programme. Erreurs de lien
sont le type d’erreurs lorsque le programme est compilé avec succès et essaie de lier d’autres objets avec notre fichier objet principal, et donc l’exécutable n’est pas généré. Par exemple, tout mauvais prototype de la fonction définie, tout fichier d’en-tête incorrect inclus, etc.
Référence indéfinie à une Class::Function()
en C++
Il s’agit de l’erreur la plus fréquente en C++ et elle est tout aussi critique, en particulier pour les nouveaux programmeurs. Ce type d’erreur de l’éditeur de liens peut affecter l’exécution du programme.
Ces erreurs se produisent principalement lorsque le programme est compilé avec succès et est en phase de liaison essayant de lier d’autres fichiers objets avec l’objet principal. Il y a des cas où le programme donne une sortie et cette erreur se produit.
Il est donc parfois compliqué de retrouver et de corriger de telles erreurs.
Une erreur de référence non définie se produit lorsque nous avons utilisé une référence à une classe, une fonction ou une variable. L’éditeur de liens ne peut pas trouver sa définition dans tous les fichiers et bibliothèques d’objets liés, générant ainsi l’erreur Référence non définie à une classe::Fonction()
.
Il peut y avoir plusieurs causes à ces erreurs, mais nous en aborderons certaines ici.
Résoudre une référence indéfinie à une Class::Function()
en raison de l’absence de définition de fonction en C++
Cela peut être la raison la plus simple de cette erreur, que vous avez fourni le prototype de la fonction mais que vous avez oublié de donner sa définition.
Lorsque vous créez une référence pour cette fonction, l’éditeur de liens ne parviendra pas à trouver sa définition, générant ainsi une erreur Undefined Reference to a Class::Function()
.
Ceci est démontré dans l’exemple ci-dessous :
#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;
}
Production:
(.text+0x15): undefined reference to Square::getArea()
collect2.exe: error: ld returned 1 exit status
Résoudre une référence indéfinie à une Class::Function()
en raison de fichiers d’objets non liés en C++
Lors de l’utilisation d’un fichier différent pour définir une classe, nous devons inclure ce fichier dans le fichier de fonction principal à lier au fichier d’objet principal lors de la liaison du programme.
Dans l’exemple ci-dessous, nous avons défini la classe Square
séparément dans un autre fichier. Dans le fichier principal, nous référençons son objet, il donnera donc une erreur de référence indéfinie car le fichier n’est pas lié.
Exemple:
#include <iostream>
using namespace std;
int main() {
Square sq1;
cout << sq1.getArea();
return 0;
}
Exemple (Square.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 solution à ce problème est de lier le fichier Square.cpp
au fichier principal dans le code suivant.
#include <iostream>
#include "square.cpp"
using namespace std;
int main() {
Square sq1;
cout << sq1.getArea();
return 0;
}
Résoudre une référence indéfinie à une Class::Function()
due à des fichiers dépendants non compilés en C++
Ce type d’erreur se produit également lorsque toutes les dépendances du programme ne sont pas compilées avec succès. Pour qu’un linker génère un exécutable avec succès, il est nécessaire de compiler toutes les dépendances avant de lancer la phase de linking.
Ceci est inévitable pour que l’éditeur de liens puisse trouver facilement tous les fichiers objets dépendants (c’est-à-dire les fichiers .o
). Si des fichiers d’objets dépendants sont manquants, l’éditeur de liens générera une erreur référence indéfinie
.
g++
de GNU, la commande Bash g++ -c abc.cpp
générera un fichier objet correspondant abc.o
sans invoquer l’éditeur de liens.Outre les situations décrites ci-dessus, il peut y avoir de nombreuses autres situations pour l’erreur de référence indéfinie. Le programmeur doit définir correctement tous les identifiants (par exemple, les fonctions, les variables et les objets) pour éviter de tels problèmes.
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