这是我定义的士兵类
class Warrior {
private :
string name;//士兵的名字
int id;//编号
int strength;//生命值
int attack;//攻击力
public:
Warrior() { cout << "new";}
Warrior (string name,int id,int strength,int attack=0):name(name),id(id),strength(strength),attack(attack){
cout <<name<< id << strength << attack << endl;}
};
这是我定义的总部类
class Headquarter {
private:
string type;//总部类别
Warrior wa;
int blue_order[5] = { 1,2,3,4,5 };//蓝军造士兵的顺序
int red_order[5] = { 4,1,5,2,3 };//红军造士兵的顺序
int hp_list[5] = {0};//按蓝军顺序为每种士兵赋予的生命值
int hp;
int iceman_num=0, lion_num=0, wolf_num=0, ninja_num=0, dragon_num=0;
public:
Headquarter(string type, int hp) :type(type), hp(hp) { }
Headquarter(string type,string name,int id,int strength,int attack,int hp):type(type),wa(name,id,strength,attack),hp(hp){}
void setHp(int a[]);//为每个士兵赋生命初始值
void creatWarrior(int i);//通过总部造士兵
};
我想通过每个总部来造属于自己的士兵,所以把Warrior定义成Headquarter的内部类。
我有以下几个问题:
1.在我初始化Headquarters类时,是不是Warrior类也会初始化?但是我在创造总部的时候不想有士兵,我应该怎么办?
2.下面是我在Headquarter类中写的创造士兵的方法
void Headquarter::creatWarrior(int i)
{
switch (i)
{
case 1:Warrior dragon(); dragon_num++; break;
case 2:Warrior ninja(); ninja_num++; break;
case 3:Warrior iceman(); iceman_num++; break;
case 4:Warrior lion(); lion_num++; break;
case 5:Warrior wolf(); wolf_num++; break;
default:
break;
}
}
比如这一句`
case 1:Warrior dragon(); dragon_num++; break;`
如果写成
`case 1:Warrior dragon; dragon_num++; break;`(少了括号)
编译器就会报错。这样不能实例化一个对象吗?还有上一句实例化dragon对象时用的是什么构造函数,似乎并没有调用无参构造函数啊。
才接触C++有些问题表达的不清楚。。。见谅哈。
PHPz2017-04-17 13:42:14
简单回答一下。
题主现在的写法并不是把Warrior
定义成Headquarter
的内部类,只是在Headquarter
类内定义了一个Warrior
成员。
1.在我初始化Headquarters类时,是不是Warrior类也会初始化?但是我在创造总部的时候不想有士兵,我应该怎么办?
你可以使用std::vector<Warrior> warriors;
来创建一个动态数组,这样在创建Headquarters
类的对象的时候只会初始化一个空的std::vector
,随后在调用creatWarrior
函数的时候通过warriors.push_back(Warrior(some-parameters...));
的方式创建士兵。
2.下面是我在
Headquarter
类中写的创造士兵的方法...
你的creatWarrior
函数看起来有些问题,这里创建了局部变量,在这个函数结束后就会被销毁。
一个最基本的方法就是通过多态来实现,即
把Warrior
实现为基类
把具体的士兵种类实现为子类,比如Dragon
类等
通过指针动态绑定,即在Headquarter
类中使用std::vector<std::shared_ptr<Warrior>> warriors;
作为成员存放士兵的指针,在creatWarrior
函数中使用如case 1: warriors.push_back(new Dragon(some-parameters...)); dragon_num++; break;
的方式创建士兵。