2010-09-12 7 views
0

J'ai une erreur de référence non définie de ma fonction principale, mais je ne trouve pas le problème. mes fichiers sont:erreur de référence undefined

//Student.h 
#ifndef STUDENT_H 
#define STUDENT_H 
#include <vector> 
#include <string> 

class Student{ 
public: 
Student(std::string &line); 
... 
virtual void evaluateValue(){} 
virtual ~Student(){} 
.... 
}; 
#endif 

//HeStudent.h 
#ifndef HESTUDENT_H 
#define HESTUDENT_H 
#include "Student.h" 

class HeStudent : public Student{ 
public: 
HeStudent(std::string line) : Student(line){ 
    ... 
} 

static int AgradesCount; 
static double Aaverage; 

virtual void evaluateValue(); 
virtual ~HeStudent(){} 

}; 
#endif 

pour chaque fichier .h il y a son fichier .cpp. J'ai aussi un fichier main.cpp qui contient le principal et dans le principal je crée: Student stud = new HeStudent (line); je ne sais pas s'il est nécessaire, mais j'inclus le Student.h et le HeStudent.h et je reçois une longue erreur et il a dit:

HeStudent::HeStudent(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)]+0x22): undefined reference to `Student::Student 

quelqu'un peut me dire quel est le problème?

Répondre

2

Une estimation: Le constructeur de votre classe HeStudent appelle le constructeur de la classe de base Student:

class HeStudent : public Student{ 
public: 
HeStudent(std::string line) : Student(line){ 
//       ^^^^^^^^^^^^^^^ 
//       call to ctor of base class 
... 

Cependant, au moins dans le code que vous nous avez montré, que le constructeur de base n'est pas réellement définie:

class Student{ 
public: 
Student(std::string &line); 
...     //^
         // do you have a definition of the ctor's body somewhere? 

Notez le point-virgule à la fin de cette ligne. Avez-vous défini le corps du constructeur ailleurs ou est-il manquant? Dans le dernier cas, cela pourrait expliquer votre erreur de compilation.


Mise à jour: Une autre supposition alors.

class Student{ 
public: 
Student(std::string &line); 
...   // ^
       // could this cause the problem? 
+0

comme je l'ai dit, chaque fichier .h a son .cpp fichier avec la mise en œuvre –

2

Vous compilez chaque fichier .cpp et pas seulement le main.cpp? Dans le cas contraire, il est un problème de liaison:

g++ -c main.cpp 
g++ -c student.cpp 
g++ -c hestudent.cpp 
g++ main.o student.o hestudent.o 
+0

Oui, je suis recompiler chacun fichier .cpp –

+0

alors je suppose que l'une des autres réponses sont correctes: p –

+0

mais comme je l'ai mentionné, la mise en œuvre est dans les fichiers .cpp –

2

Où mettez-vous la définition de votre constructeur:

Student(std::string &line); 

Je ne vois pas, et si elle est manquant, alors qui est au moins un problème que vous avez. Vous remarquerez que vous avez {} après chacune de vos autres déclarations qui les définit également. Vous constructeur n'a pas de tels accolades ainsi vous devez définir le constructeur ailleurs. (probablement dans un fichier Student.cpp)

Vous n'avez pas montré le fichier Student.cpp, donc vous pouvez penser que vous l'avez défini et vous ne l'avez pas. Assurez-vous que vous avez le Student(std::string &line) défini comme:

Student::Student(std::string &line) 
{ 
    // Any specific code you need here 
} 
+0

il est dans un fichier Student.cpp –

+0

Pouvez-vous tester si vous pouvez créer un étudiant directement? Aussi, juste comme une suggestion, votre constructeur d'étudiant devrait être Student (const std :: string & line) à moins que pour une raison quelconque vous avez besoin/voulez que le constructeur d'étudiant change la ligne passée par l'appelant. –

2

Eh bien, je l'ai trouvé mon problème, dans le fichier Student.cpp i en ligne du constructeur. ai-je changé la signature du constructeur lors de l'ajout d'inline? pourquoi ça règle mon problème?

+1

De la FAQ C++ sur les fonctions inline: Note: Il est impératif que la définition de la fonction (la partie entre {...}) soit placée dans un fichier d'en-tête, sauf si la fonction est utilisée dans un seul fichier .cpp. En particulier, si vous placez la définition de la fonction inline dans un fichier .cpp et que vous l'appelez à partir d'un autre fichier .cpp, vous obtiendrez une erreur "non résolue externe" de l'éditeur de liens. –

Questions connexes