#include<iostream>
#include<string.h>
using namespace std;
class Warrior {
public:
char* type;
int health;
Warrior(char* itype, int ihealth) {
strcpy(type, itype);
health = ihealth;
}
Warrior(const Warrior* w) {
strcpy(type, w->type);
health = w->health;
}
// Warrior() { }
};
// headquarter
class HeadQuarter {
private:
Warrior warrior[5];
...
public:
HeadQuarter(Warrior *w[5], int icap, int ihealth[5]) {
init();
capacity = icap;
for (int i = 0; i < 5; i++) warrior[i] = *w[i];
}
};
大家好,当我尝试通过一组Warrior
poiters构建我的HeadQuarter
类时,它告诉我需要空参数构造函数Warrior :: Warrior()才能执行此操作。这是否意味着它在传递指针时尝试构造对象?
答案 0 :(得分:0)
这不是因为您传递数组。这是因为你班上的以下一行:
Warrior warrior[5];
这会尝试调用Warrior的默认构造函数,但是没有默认构造函数。因此错误。
你的Warrior
构造函数很糟糕。复制到未初始化的char*
是一种灾难。
另一方面,您的功能签名并不能完成您的预期。忽略数组参数的大小,因为数组在传递给函数时会衰减为指针,并且可以写为
HeadQuarter(Warrior** w, int icap, int* ihealth)
答案 1 :(得分:0)
Warrior warrior[5];
在这里,您要声明一组Warrior
个对象。必须实例化该数组,无论它是全局变量还是类的成员。这意味着必须构造Warrior
类。由于您在此处未看到任何构造函数参数,因此逻辑上意味着Warrior
必须具有默认构造函数。
可以使用初始化器语法实例化这样的类数组;但在这种情况下,您仍然需要提出构造函数/初始化程序参数。
public:
char* type;
int health;
Warrior(char* itype, int ihealth) {
strcpy(type, itype);
health = ihealth;
}
这里,Warrior
构造函数是strcpy()
到尚未初始化的指针。几乎可以保证崩溃。
最好停止编写这种容易出错的C风格代码,并编写真正的C ++代码,而不是C代码。这意味着对std::string
使用type
;这完全避免了这个问题。