我有一个类,比方说
class XXX{
...
};
我想声明该类对象的全局数组,例如
XXX* arr = new XXX[50];
但是,例如,我在xxx.h文件(类的头文件)中声明:
extern XXX* arr;
并且在xxx.cpp文件中我做:
XXX* arr = new XXX[50];
但是,Borland C++给出了以下错误:
找不到用于初始化类型为"XXX"的数组元素的默认构造函数
当我刚刚在xxx.cpp文件中声明以下内容时
XXX*arr[50];
我在其他cpp文件(如)中收到一些错误消息
未定义的符号arr;
总之,我该如何声明我的这个数组?
更新:我有一个有3个参数的构造函数,我不希望它们有默认值。
此外,我在宏中"声明"了构造函数,如下所示:
#define PREP(num, c)
IVT ivt##num(evInt##num,num,c);
void interrupt evInt##num(...){
iv[##num]->signalize();
}
因此,IVT IVT###num(evInt###num,num,c);是类IVT的构造函数,我想声明一个包含X元素的指针的全局数组。
找不到用于初始化类型为"XXX"的数组元素的默认构造函数
也就是说,你没有一个不接受任何参数的构造函数(即默认构造函数)。你在XXX课上定义过它吗?若您有接受任何参数的构造函数,那个么编译器不提供默认的构造函数。
XXX* arr = new XXX[50];
上面的语句调用默认构造函数50次。顺便说一句,请给一个有意义的类名。这有点冒犯。
当我刚刚在xxx.cpp文件中声明以下内容时
如果仅在.cpp
文件中声明,则该变量仅对当前转换单元可见。您仍然需要在头文件中有extern声明,以便其他源对象文件能够链接到它。
找不到用于初始化类型的数组元素的默认构造函数'XXX'
您需要默认构造函数,因为您将使用它在以下位置创建类的默认实例:
XXX* arr = new XXX[50];
您可能已经实现了另一个构造函数,其中一些带有参数,这就是为什么编译器没有为您自动生成默认构造函数的原因。它可能看起来像这样:
class XXX{
public:
XXX(){}
};
下一篇:
当我刚刚在xxx.cpp文件中声明以下内容时
XXX*arr[50];
我在其他cpp文件(如)中收到一些错误消息
未定义的符号arr;
您需要一个仍在标头中的extern
声明来解析其他翻译单元中的符号。这就是C++03标准所说的:
程序的文本保存在称为源文件的单元中国际标准。包含所有标头的源文件(17.4.1.2)和通过预处理包含的源文件(16.2)指令#include,减去条件包含(16.1)预处理指令,称为翻译单位。[注意:C++程序不需要全部在同时。]