声明存储外部头文件结构体的数组时触发“Incomplete Type "array[]" is not allowed”错误的求助
声明存储外部头文件结构体的数组时触发“Incomplete Type "array[]" is not allowed”错误的求助
嘿,我来帮你搞定这个问题!你碰到的错误根源很明确:C++不允许在类中使用柔性数组(也就是你写的MyStruct array[]这种空大小的数组写法)。
这种空括号的数组是C语言的特性,而且就算在C里,柔性数组也只能作为结构体的最后一个成员存在,目的是实现可变长度的结构体。但C++的类要求对象有确定的内存大小,你写的MyStruct array[]没有指定大小,编译器根本没法计算MyClass对象需要占用多少内存,所以就会抛出“不完全类型不允许”的错误。
给你几个实用的解决方案,按推荐程度排序:
1. 使用std::vector(最推荐,灵活又安全)
这是C++里处理动态数组的标准方式,不需要手动管理内存,还能自动扩容。只要包含<vector>头文件就行:
#include "File1.h" #include <vector> // 必须包含这个头文件 class MyClass { public: std::vector<MyStruct> array; // 可以随时添加、删除元素 };
之后你可以用array.push_back()添加元素,array.size()获取长度,完全不用操心内存分配的问题。
2. 声明固定大小的数组
如果你提前知道数组最多需要存多少个元素,直接指定大小就可以:
class MyClass { public: MyStruct array[20]; // 固定20个MyStruct元素 };
这种方式简单直接,但缺点是大小固定,没法动态调整。
3. 用指针手动动态分配(不推荐新手)
如果一定要用指针实现动态数组,需要自己处理内存的分配和释放,还要注意避免内存泄漏和浅拷贝问题:
#include "File1.h" class MyClass { public: MyStruct* array; int arraySize; // 构造函数中分配内存 MyClass(int size) : arraySize(size) { array = new MyStruct[arraySize]; } // 析构函数中释放内存,防止泄漏 ~MyClass() { delete[] array; } // 禁用默认拷贝构造和赋值运算符,避免浅拷贝导致的重复释放 MyClass(const MyClass&) = delete; MyClass& operator=(const MyClass&) = delete; };
这种方式需要你自己把控内存生命周期,很容易出错,所以除非有特殊需求,优先选std::vector。
总结一下:你原来的写法是C的柔性数组,C++类里不支持这种用法,换上面的任意一种方式都能解决问题~
内容来源于stack exchange
相关产品推荐
相关产品推荐

