1

我有一堂课,比如说

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 元素的全局指针数组。

4

2 回答 2

1

找不到默认构造函数来初始化“XXX”类型的数组元素

意味着,您没有不带任何参数的构造函数(即默认构造函数)。您是否在您的 XXX 类中定义了它?如果您的构造函数带有任何参数,则编译器不会提供默认构造函数。

XXX* arr = new XXX[50];

上述语句调用默认构造函数 50 次。顺便说一句,请给一个有意义的类名。这有点冒犯。

当我在 xxx.cpp 文件中声明以下内容时

如果您.cpp仅在文件中声明,则该变量仅对当前翻译单元可见。您仍然需要在头文件中有 extern 声明,以便其他源目标文件能够链接到它。

于 2013-08-10T22:21:47.880 回答
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) 和通过预处理指令#include 包含的源文件 (16.2),减去任何由任何条件包含 (16.1) 预处理指令跳过的源代码行,称为翻译单元。[注意:一个 C++ 程序不需要同时翻译。]

于 2013-08-10T22:25:18.820 回答