'SiteList'的构造函数必须显式初始化没有默认构造函数的成员'sites'

时间:2014-02-27 01:01:12

标签: c++ constructor

我有一个名为SiteList的类,它包含一个包含Site对象的数组。但是当我编译时,我收到的错误是

  

错误:'SiteList'的构造函数必须显式初始化没有默认构造函数的成员'sites'

有人可以帮帮我吗?

这是我的头文件SiteList.h

#include <iostream>
#include "Site.h"
using namespace std;

class SiteList {
public:
    int getLength();
    string checkStatus(int, int);
    void printList();
    void inputData(Site);
    SiteList(Site);
private:
    Site sites[600];
    int arrayCounter;
};

我的构造函数(只是我的构造函数)

SiteList::SiteList(Site site){
    sites[600];
    arrayCounter = 0;
}

2 个答案:

答案 0 :(得分:1)

首先,我不明白为什么构造函数的参数Site site没有被使用?

SiteList::SiteList(Site site){
    sites[600];
    arrayCounter = 0;
}

此声明

sites[600];

表示访问索引为600的数组网站的元素。显然它没有任何意义。

至于错误消息,那就足够清楚了:类Site没有默认构造函数。你在这句话中不明白什么?

当调用此构造函数时,它会尝试创建数据成员Site sites[600];,为数组的每个元素调用Site类型的默认构造函数。但该类没有默认构造函数。

来自C ++标准:

  

类X的默认构造函数是类X的构造函数   可以不带参数调用。

您应该为类Site提供默认构造函数。

一些额外的评论

成员函数getLengthprintList应定义为constatn函数

int getLength() const;
void printList() const;

而不是幻数600,最好引入符号常量。例如

private:
    static const int N = 600;
    Site sites[N];
    int arrayCounter;
};

答案 1 :(得分:0)

在构造函数中,行

sites[600];

不会做你认为它做的事情(可能)。它引用sites数组的索引600处的元素,并且不对其执行任何操作。 (此外,它是未定义的行为,因为数组只有索引0到599.)

出现编译错误,因为Site类可能没有默认构造函数。如果一个类没有默认构造函数,那么除非显式提供构造函数参数,否则编译器不知道如何初始化它。然而,每次实例化SiteList时,都会创建一个Site个对象数组,因此编译器知道如何初始化Site个对象。 / p>

解决方案是为Site添加默认构造函数,

Site::Site() {
    // ...
}