最近学到了继承,做作业(程序设计基础 - 周霭如 - p312- 二 -1)时才发现这里面名堂比书上的多了去了,本人使用的是VS 2017,花了一下午时间敲好基本的代码后,包含希望的按F5,结果错误多的一个屏幕显示不完,主要是什么
Employee类未定义
Employee类型重定义
使用了未定义的class Employee
一开始我是把各类的声明和定义都在头文件里写完了,出问题后又拆成.h和.cpp文件,问题依旧,上网找了很久发现是因为头文件的第一行少打了"#pragma once"这个东西,这个非常重要,是让该头文件只编译一次用的。因为Employee这个基类有两个派生类,每个派生类编译时,因为include了Employee,所以如果没有#pragma once,则会让基类头文件多次被编译,导致了上面提到的一系列”定义问题”
源代码 |
//By Alvin.Wang
//wtsir@live.com
//Employee.h
#pragma once //防止头文件多次被编译!!!
#include<iostream>
using namespace std;
class Employee
{
public:
Employee() {
puts("Employee object initialized");
}
~Employee() {
puts("Employee object destroyed");
}
void input();
void pay();
void print();
static double commrate;
private:
int number=-1; //编号
char name[20]; //名字
double basicSalary=2000; //基本工资
double salary=-1; //月薪
};
_________________________________________________________________________________________
//employee.cpp
#include"Employee.h"
//input employee
void Employee::input() {
cout << "E:number: ";
cin >> number;
cout << "name: ";
cin >> name;
}
//pay employee
void Employee::pay() {
salary = basicSalary; //一般员工工资
}
//print enployee
void Employee::print() {
cout << "Type:Employee\nnumber\t" << "name\t" << "salary\n";
cout<< number << '\t' << name << '\t' << salary << endl;
}
double Employee::commrate = 0.005; //提成比例
_________________________________________________________________________________________
//Salesman.h
#pragma once
#include"Employee.h"
class Salesman:public Employee
{
public:
Salesman() {
puts("Salesmana object initialized");
}
~Salesman() {
puts("Salesman object destroyed");
}
void pay();
void input();
void print();
private:
int number=-1; //编号
char name[20]; //名字
double basicSalary=2000; //基本工资
double salary=-1; //月薪
double sales=-1; //销售额
};
_________________________________________________________________________________________
//salesman.cpp
#include"Salesman.h"
//input salesman
void Salesman::input() {
cout << "S:number: ";
cin >> number;
cout << "name: ";
cin >> name;
cout << "sales: ";
cin >> sales;
}
//pay salesman
void Salesman::pay() {
salary = basicSalary + (sales*commrate);
}
//print salesman
void Salesman::print() {
cout << "Type:Salesman\nnumber\t" << "name\t" << "sales\t" << "salary\n";
cout<< number << '\t' << name << '\t' << sales << '\t' << salary << endl;
}
_________________________________________________________________________________________
//salesmanager.h
#pragma once
#include"Employee.h"
class Salesmanager: public Employee
{
public:
Salesmanager() {
puts("Salesmanager object initialized");
}
~Salesmanager() {
puts("Salesmanager object destroyed");
}
void pay();
void input();
void print();
private:
int number=-1; //编号
char name[20]; //名字
double basicSalary = 2000; //基本工资
double salary=-1; //月薪
double sales=-1; //销售额
double jobsalary=3000; //岗位工资
};
_________________________________________________________________________________________
//salesmanager.cpp
#include"Salesmanager.h"
//input salemanager
void Salesmanager::input() {
cout << "M:number: ";
cin>>number;
cout << "name: ";
cin >> name;
cout << "sales: ";
cin >> sales;
}
//pay salesmanager
void Salesmanager::pay() {
salary = basicSalary + (sales*commrate) + jobsalary;
}
//print salesmanager
void Salesmanager::print() {
cout << "Type:Salesman\nnumber\t" << "name\t" << "sales\t" << "salary\n";
cout<< number << '\t' << name << '\t' << sales << '\t' << salary << endl;
}
_________________________________________________________________________________________
//main.cpp
#include"Employee.h"
#include"Salesman.h"
#include"Salesmanager.h"
int main() {
cout << "|Please input the employee's type\n|1:Employee\n|2:Salesman\n|3:Salesmanager\n|Type:___\b\b";
int n; //员工类型判断器
cin >> n;
cout << "______________________________________\n";
if (n == 1) {
Employee*p = new Employee;//如果是普通员工那么p就指向一个新的employee对象
p->input();
p->pay();
p->print();
delete p;
}
if (n == 2) {
Salesman*p = new Salesman;//销售员
p->input();
p->pay();
p->print();
delete p;
}
if (n == 3) {
Salesmanager*p = new Salesmanager;//经理
p->input();
p->pay();
p->print();
delete p;
}
if (n < 1 && n>3) {
cout << "error: type of " << n << " not exsist input again\n";
return main();
}
system("pause");
return 0;
}