我有一节课,让我们说
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元素的全局指针数组。
答案 0 :(得分:1)
无法找到默认构造函数来初始化“XXX”类型的数组元素
意味着,您没有不带任何参数的构造函数(即默认构造函数)。你在XXX课程中定义了吗?如果你有构造函数接受任何参数,那么编译器不提供默认构造函数。
XXX* arr = new XXX[50];
上述语句调用默认构造函数50次。顺便说一下,请给出一个有意义的班级名称。这有点令人反感。
当我在xxx.cpp文件中声明以下内容时
如果仅在.cpp
文件中声明,则该变量仅对当前翻译单元可见。您仍然需要在头文件中使用extern声明,以便能够链接到其他源对象文件。
答案 1 :(得分:0)
找不到默认构造函数来初始化类型的数组元素 '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)预处理指令,称为a 翻译单位。 [注意:一个C ++程序不需要全部翻译 同一时间。 ]