搜尋

首頁  >  問答  >  主體

C++内部类有关构造函数的问题

这是我定义的士兵类

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++有些问题表达的不清楚。。。见谅哈。

黄舟黄舟2774 天前393

全部回覆(1)我來回復

  • PHPz

    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;的方式創建士兵。

    回覆
    0
  • 取消回覆