这是我定义的士兵类
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;
的方式創建士兵。