我的主要功能有未定义的引用错误,但我找不到问题。 我的档案是:
//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
谁能告诉我这是什么问题?
答案 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文件中我内联了构造函数。 添加内联时,我是否更改了构造函数的签名?为什么它解决了我的问题?