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

3
我有一个叫做SiteList的类,其中包含一个包含Site对象的数组。但是当我编译时,出现了以下错误:

错误:必须显式初始化成员“站点”(该成员没有默认构造函数)的构造函数

有人能帮助我吗?

这是我的头文件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个回答

1
首先,我不明白为什么构造函数有一个未使用的参数Site site
SiteList::SiteList(Site site){
    sites[600];
    arrayCounter = 0;
}

还有这个声明

sites[600];

意味着访问索引为600的数组sites的元素。很明显这没有任何意义。

至于错误信息,则非常清晰:Site类没有默认构造函数。你在这个短语中不理解什么?

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

来自C++标准:

X类的默认构造函数是指可以无需参数调用的X类构造函数。

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

一些额外的备注

成员函数getLengthprintList应定义为常量函数。

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

不要使用神秘数字600,最好引入一个符号常量。例如

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

如果 Site 类需要构造函数作为良好的设计选择,那么她/他应该只添加 Site 的构造函数。 - The Floating Brain

0
在你的构造函数中,这一行
sites[600];

它不会做你想象中的事情(很可能)。它是指sites数组中索引为600的元素,并且不对其执行任何操作。(此外,这是未定义行为,因为该数组仅具有0到599的索引。)

编译错误出现的原因是Site类很可能没有默认构造函数。如果一个类没有默认构造函数,那么编译器就不知道如何初始化它,除非您明确提供构造函数参数。然而,每次实例化SiteList时,都会创建一个Site对象数组,因此编译器必须知道如何初始化Site对象。

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

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

Site::Site(int siteID, string siteName, string status, string remediationStatus, string typeOfContamination, int Xcord, int Ycord){ this->siteID = siteID; this->siteName = siteName; this->status = status; this->remediationStatus = remediationStatus; this->typeOfContamination = typeOfContamination; this->Xcord = Xcord; this->Ycord = Ycord; } - tokimoto
@tokimoto 这不是默认构造函数。默认构造函数不带任何参数。 - Brian Bi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接