0

我从我的主函数中得到未定义的引用错误,但我找不到问题。我的文件是:

//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 文件,其中包含我创建的主要和主要内容: 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

4 回答 4

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?
于 2010-09-12T13:42:40.123 回答
2

您是否正在编译每个 .cpp 文件而不仅仅是 main.cpp ?如果不是,则为链接器问题:

g++ -c main.cpp
g++ -c student.cpp
g++ -c hestudent.cpp 
g++ main.o student.o hestudent.o
于 2010-09-12T13:43:07.140 回答
2

您将构造函数的定义放在哪里:

Student(std::string &line);

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

您还没有显示 Student.cpp 文件,因此您可能认为您已经定义了它而您没有。确保您已Student(std::string &line)定义为:

Student::Student(std::string &line)
{
   // Any specific code you need here
}
于 2010-09-12T13:44:02.147 回答
2

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

于 2010-09-12T13:53:22.373 回答