具有可变大小的C++全局队列数组
C++ Global Array of Queues with variable size
我正在处理一个项目,该项目需要一个类QueueArray,它是一个队列数组。我已经有一段时间没有使用c++数组了,所以我在调试为什么我的代码会抛出错误时遇到了一些困难。
为了获得一些灵感,我阅读了删除一组队列对象(以及在谷歌上的几个小时),但我仍然对以下代码有错误:
#include <iostream>
#include <deque>
#include <queue>
using namespace std;
class QueueArray
{
queue<int> theArray[];
QueueArray::QueueArray(int size)
{
queue<int> theArray[] = new queue<int>[size];
//theArray[] = new queue<int>[size]; //this may be closer, but also giving errors
}
};
错误是:
警告C4200:使用了非标准扩展:结构/联合中的零大小数组1> 当UDT包含大小为零的数组时,无法生成复制ctor或复制赋值运算符
和
错误C2075:"数组":数组初始化需要大括号
我已经读到了关于第二个错误的消息,但我似乎能弄清楚我需要做什么来修复它。
我需要它是一个可变大小的数组,并将变量传递给类,这就是为什么我不能初始化数组的大小,而且它必须是全局范围的,这样我才能在类中的其他函数中使用它(类不能通过参数传递给数组)。
稍后,队列将是用户定义的类型,但我们现在允许它们是int的队列,不确定这是否有区别。我一直看到有人建议在这些情况下使用载体,但我对此别无选择。
如有任何建议,我们将不胜感激。
queue<int>* theArray;
不是
queue<int> theArray[];
在堆上分配数组时,会返回一个指向数组开头的指针,而不是一个数组。因此,您需要将数组声明为
queue<int>* theArray;
在某些情况下允许使用空括号,但有特定的含义。它可以在初始化静态大小的数组时使用:
queue<int> theArray[] = { queue<int>(), queue<int>() /*...*/ };
创建一个大小与初始化程序列表匹配的数组,但它仍然可以为空。您也可以在函数的参数列表中使用空括号,在这种情况下,使用等效于使用指针表示法,例如:
int main(int ac, char* av[])
与相同
int main(int ac, char** av)
在C++中不可能使用可变大小的数组。要使代码正常工作,请使用指针,即
class QueueArray
{
queue<int> * const theArray;
QueueArray::QueueArray(int size)
: theArray (new queue<int>[size])
{ /* ... */ }
~QueueArray()
{ delete[] theArray; }
};
然而,在C++中,您应该真正避免这种情况,而是使用std::vector
,即
typedef vector<queue<int>> QueueArray;
相关文章:
- 为什么在全局范围内使用"extern int a"似乎不行?
- 在全局变量中保存类的实例以重新创建类(创建"backup")
- 当vector是tje全局变量时,c++中vector的内存管理
- std::threads可以从Windows DLL中的全局变量创建/销毁吗?
- 如何创建一个空的全局类并在启动时实例化它
- 内联函数中具有内部链接的全局变量
- 为什么虚函数不能是静态的和全局的?
- 如何在信号处理程序和普通函数中对全局变量进行互斥读写操作
- 全局作用域中函数指针的赋值
- g++用户定义的动态链接库上的全局new和delete运算符
- 在命名空间中使用全局命名空间中的函数
- 全局变量 多读取器 一个写入器多线程安全?
- 类的全局对象和静态成员
- 如何声明一个可以在整个程序中使用的全局 2d 3d 4d .. 数组(堆版本)变量?
- 如果全局变量默认是外部变量,为什么要添加"extern"关键字?
- 不同作用域中的静态变量和全局变量
- 如何使用 llvm-10 库在C++定义 LLVM 全局值变量?
- 使用全局声明的向量时,C++双重释放错误/损坏
- 将线程中的数据存储到全局容器的最佳方法?
- 如何重写全局方法名称以在调用原始方法之前将我的代码推到前面