我有一个名为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;
}
答案 0 :(得分:1)
首先,我不明白为什么构造函数的参数Site site
没有被使用?
SiteList::SiteList(Site site){
sites[600];
arrayCounter = 0;
}
此声明
sites[600];
表示访问索引为600的数组网站的元素。显然它没有任何意义。
至于错误消息,那就足够清楚了:类Site没有默认构造函数。你在这句话中不明白什么?
当调用此构造函数时,它会尝试创建数据成员Site sites[600];
,为数组的每个元素调用Site类型的默认构造函数。但该类没有默认构造函数。
来自C ++标准:
类X的默认构造函数是类X的构造函数 可以不带参数调用。
您应该为类Site提供默认构造函数。
一些额外的评论
成员函数getLength
和printList
应定义为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() {
// ...
}