---更新---
我在项目中包含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
答案 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.cpp
和Teacher.cpp
,而不是Person.h
和Teacher.h
。
其次,要么禁用项目中的预编译头,要么确保#include "stdafx.h"
始终是每个实现文件中第一个有意义的行。所有其他#include
指令应该在 #include "stdafx.h"
之后,而不是之前。
答案 2 :(得分:0)
只需将警卫放入标题
即
#ifndef _THIS_FILENAME
#define _THIS_FILENAME
wibble etc
#endif
修改强>
忘记提及使用前向声明 - 节省了重新编译的费用。