C ++中的基类未定义错误

时间:2012-11-10 00:26:27

标签: c++ header

---更新---

我在项目中包含header和cpp文件时遇到问题,所以这里是文件: Person.h

#ifndef PERSON_H
#define PERSON_H

class Person {
private:
string firstName;
string lastName;
long NID;

public:
Person();
void toString();

string get_firstName() {
    return firstName;
}

string get_lastName() {
    return lastName;
}

long get_NID() {
    return NID;
}
};

#endif

扩展Person的老师 Teacher.h

#include "Person.h"
#include <iostream>

#ifndef TEACHER_H
#define TEACHER_H

class Teacher : public Person {
private:
int avg_horarium;

public:
Teacher();
void toString();

int get_avg_horarium() {
    return avg_horarium;
}
};

#endif

然后是Teacher.cpp:

#include "Teacher.h"
using namespace std;

Teacher::Teacher() : Person() {
cout << "Enter average monthly horarium: ";
cin >> avg_horarium;
}

void Teacher::toString() {
Person::toString();
cout << "Average monthly horarium: " << avg_horarium;
}

扩展Person的另一个类是学生,因为它与老师相似,所以我不会在这里提出。我的问题是在屏幕截图上得到所有这些错误我做错了什么: http://s14.postimage.org/45k08ckb3/errors.jpg

3 个答案:

答案 0 :(得分:1)

在你的头文件中放置;

 #ifndef CLASSNAME_H
 #define CLASSNAME_H

在文件的顶部,在include语句之后,在类声明之前。把

#endif

在所有代码之后的文件底部。这确保了类只定义一次。拥有相同头文件的多个包含通常会导致链接问题。

答案 1 :(得分:1)

问题是您对stdafx.h文件的错误处理。在MSVC编译器中,当启用预编译标头时,#include "stdafx.h"行之前的所有内容都将被忽略

首先,停止将stdafx.h包含在标头(.h)文件中。 stdafx.h应该包含在实现(.cpp)文件中。在您的情况下,#include "stdafx.h"应放入Person.cppTeacher.cpp,而不是Person.hTeacher.h

其次,要么禁用项目中的预编译头,要么确保#include "stdafx.h"始终是每个实现文件中第一个有意义的行。所有其他#include指令应该在 #include "stdafx.h"之后,而不是之前。

答案 2 :(得分:0)

只需将警卫放入标题

#ifndef _THIS_FILENAME
#define _THIS_FILENAME

wibble etc


#endif

修改

忘记提及使用前向声明 - 节省了重新编译的费用。