一组对象指针作为参数

时间:2016-06-09 01:42:03

标签: c++

#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()才能执行此操作。这是否意味着它在传递指针时尝试构造对象?

2 个答案:

答案 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;这完全避免了这个问题。