未定义的引用错误

时间:2010-09-12 13:39:16

标签: c++ undefined-reference

我的主要功能有未定义的引用错误,但我找不到问题。 我的档案是:

//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

对于每个.h文件,都有他的.cpp文件。 我还有一个main.cpp文件,其中包含main和主要创建: Student stud = new HeStudent(line); 我不知道是否有必要,但我包括了Student.h和HeStudent.h 我得到了一些很长的错误,它说:

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

谁能告诉我这是什么问题?

4 个答案:

答案 0 :(得分:2)

猜测:类HeStudent的构造函数调用基类Student的构造函数:

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

但是,至少在您向我们展示的代码中,基本构造函数实际上并未定义:

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

请注意此行末尾的分号。你有没有在其他地方定义构造函数的主体或它是否丢失?在后一种情况下,这可能解释了您的编译错误。


更新:然后另一个猜测。

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

答案 1 :(得分:2)

您是在编译每个.cpp文件而不仅仅是main.cpp吗?如果不是,那就是链接器问题:

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

答案 2 :(得分:2)

你在哪里提出构造函数的定义:

Student(std::string &line);

我没有看到它,如果它丢失了,那么这至少是你遇到的一个问题。你会注意到在你的每个其他声明之后你都有{},它们也定义了它们。构造函数没有这样的大括号,因此您必须在其他地方定义构造函数。 (可能在Student.cpp文件中)

您尚未显示Student.cpp文件,因此您可能认为已对其进行了定义,而您却没有。确保将Student(std::string &line)定义为:

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

答案 3 :(得分:2)

好吧,我发现了我的问题,在Student.cpp文件中我内联了构造函数。 添加内联时,我是否更改了构造函数的签名?为什么它解决了我的问题?