问题及代码:
//文件1,类的定义,Weapon.h
#ifndef SADF #define SADF #include<string> using namespace std; class Weapon { public: Weapon(string wnam, int f); int getForce(); private: string wname; //名称 int force; //威力 }; #endif /*因为重复包含头文件, 所以要在开头结尾加上#ifndef SADF #define SADF #endif */
//文件2,类的定义,Role.h
#include"Weapon.h" class Role { public: Role(string nam, int b, string wnam, int f); //构造函数 ~Role(); //析构函数 void eat(int d); //吃东西,涨d血 void attack(Role &r); //攻击别人,自己涨血,同时失血 bool isAlived(); //是否活着 void show(); //显示 private: string name; int blood; Weapon weapon; bool life; };//文件3,类的实现,Weapon.cpp
#include<iostream> using namespace std; #include"Weapon.h" Weapon::Weapon(string wnam, int f):wname(wnam),force(f) {} int Weapon::getForce() { return force; }//文件4,类的实现,Role.cpp
#include<iostream> #include"Weapon.h" #include"Role.h" using namespace std; Role::Role(string nam, int b, string wnam, int f):name(nam),blood(b),weapon(wnam,f) { if(blood>0) life=true; else life=false; } Role::~Role() { cout<<name<<"退出江湖..."<<endl; } void Role::eat(int d) //吃东西,涨d血 { if(isAlived()) blood+=d; } void Role::attack(Role &r) //攻击别人,涨1血 { if(isAlived()) { blood+=weapon.getForce(); r.blood-=weapon.getForce(); if(r.blood<=0) r.life=false; } } bool Role::isAlived() //是否活着 { return life; } void Role::show() //显示 { cout<<name<<" has "<<blood<<" blood, it is "; if(isAlived()) cout<<"alived."; else cout<<"dead."; cout<<endl; }文件5,主函数,demo.cpp
#include <iostream> using namespace std; #include"Role.h" int main( ) { Role mary("Mary", 500, "TuLong",200); Role jack("Jack", 10, "YiTian", 180); cout<<"---begin---"<<endl; mary.show(); jack.show(); cout<<"---1st round---"<<endl; jack.attack(mary); mary.show(); jack.show(); cout<<"---2nd round---"<<endl; mary.attack(jack); mary.show(); jack.show(); cout<<"---end---"<<endl; return 0; }
知识点总结:
在写本程序的时候,发现总是会提示class' type redefinition,最终发现需要在Weapon.h头文件中添加上编译预处理指令才能通过,否则将是重复包含头文件,会出现错误。
学习心得:
使用分文件来编写程序可以使程序模块化,简洁化,看起来更加的直观。