问题描述
这是我定义的士兵类
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++有些问题表达的不清楚。。。见谅哈。
问题解答
回答1:简单回答一下。
题主现在的写法并不是把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;的方式创建士兵。

