void HeadQuarter::makeWarriors(int time, int k) { if (lastIndex == -2) return; int index = (lastIndex + 1) % WarriorNum; int wKind = sequence[index]; int cnt = 0; if (leftValue < initLifeValue[wKind]) { lastIndex = -2; return; } lastIndex = index; int id = ++totalNum; leftValue -= initLifeValue[wKind]; shared_ptr<Warrior> pw = Warrior::create(wKind, this, id, initLifeValue[wKind], attackValue[wKind] , k); warriors.push_back(pw); pw->logBirth(time); }
时间: 2024-01-11 15:05:41 浏览: 69
这是一个 C++ 函数 makeWarriors,它是一个 HeadQuarter(司令部)类的成员函数。这个函数的作用是制造武士。函数的参数包括当前的时间 time 和武士的阵营 k。函数内部会根据上一次制造的武士的种类和当前时间来确定这次制造的武士的种类,并检查司令部剩余的生命元是否足够制造这个武士。如果生命元不足,则会更新 lastIndex 的值为 -2,表示无法制造新的武士。如果生命元足够,就会生成一个新的武士对象,并将其加入到 warriors 容器中。最后,函数会记录这个武士的出生时间。
相关问题
class headquarter : public city { protected: game_controller* _controller; camp_label _camp; int _health_point; std::vector<std::unique_ptr<warrior>> _warriors; // RAII int _last_generate_warrior = -1; std::array<int, warrior_type_count> _warrior_record{ 0 }; bool _stopped = false; public: headquarter(camp_label camp, int health_point, game_controller* controller) noexcept : _camp(camp), _health_point(health_point), _controller(controller) {} virtual ~headquarter() = default; virtual void on_update_time(int new_time) override; protected: void generate_warrior(int time); };
这是一个 C++ 的类 headquarter,它继承自另一个类 city。headquarter 类具有一些成员变量和成员函数:
- _controller:指向游戏控制器的指针。
- _camp:阵营标签,用于标识是红方还是蓝方。
- _health_point:总血量。
- _warriors:一个 vector,用来存储生成的 warrior 对象的智能指针,这里使用了 RAII(资源获取即初始化)技术,确保对象的正确释放。
- _last_generate_warrior:上一次生成 warrior 的时间。
- _warrior_record:一个数组,用来记录不同类型 warrior 的数量,长度为 warrior_type_count。
- _stopped:标志 headquarter 是否已经停止生成 warrior。
成员函数:
- 构造函数 headquarter:初始化 _camp、_health_point 和 _controller。
- 析构函数 ~headquarter():默认析构函数。
- on_update_time:虚函数,用来在时间更新时更新 headquarter 对象的状态。
- generate_warrior:生成 warrior 对象,并将其存储在 _warriors 中。
#include<iostream> using namespace std; class Iceman { public: int num; int hp; int atk; int sword = 0; int bomb = 0; int arrow = 0; static int totalNum; Iceman(int n, int h, int a) { num = n; hp = h; atk = a; totalNum++; } }; int Iceman::totalNum = 0; int main() { Iceman* red_iceman[100]; int Iceman_totalNum = 0; int current_hp = 3; red_iceman[Iceman_totalNum] = new Iceman(Iceman::totalNum + 1, current_hp, 0); Iceman_totalNum++; cout << " red iceman " << " born with strength " << red_iceman[Iceman_totalNum]->hp << "," << Iceman_totalNum << " iceman in red headquarter" << endl; }这段代码有什么问题
这段代码有两个问题:
1. 在输出语句中,`red_iceman[Iceman_totalNum]`已经是指向新创建的Iceman对象的指针,因此应该使用`->`而不是`.`来访问`hp`成员变量。正确的输出语句应该是:
```
cout << " red iceman " << " born with strength " << red_iceman[Iceman_totalNum]->hp << "," << Iceman_totalNum << " iceman in red headquarter" << endl;
```
2. 在创建Iceman对象时,构造函数中的`totalNum++`语句应该在其他语句之前执行,否则创建的第一个Iceman对象的编号会是0而不是1。正确的构造函数应该是:
```
Iceman(int n, int h, int a) {
totalNum++;
num = n;
hp = h;
atk = a;
}
```
阅读全文