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

查看:608
本文介绍了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++有些问题表达的不清楚。。。见谅哈。

解决方案

简单回答一下。

题主现在的写法并不是把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;的方式创建士兵。

这篇关于C++内部类有关构造函数的问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆