2

我正在开发一个需要队列数组的类 QueueArray 的项目。自从我使用 c++ 数组以来已经有一段时间了,所以我在调试为什么我的代码抛出错误时遇到了一些麻烦。

我阅读了删除队列对象数组以获得一些灵感(以及在 Google 上的几个小时),但我仍然遇到以下代码错误:

    #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:“theArray”:数组初始化需要花括号

我已经阅读了第二个错误,但我似乎可以弄清楚我需要做些什么来修复它。

我需要它是一个可变大小的数组,并将变量传递给类,这就是为什么我不能在顶部初始化数组的大小,它必须是全局范围的,所以我可以在其他函数中使用它类(类不能通过参数传递数组)。

稍后,队列将是用户定义的类型,但我们现在让它们成为整数队列,不确定这是否会有所不同。我不断看到有人建议在这些情况下使用向量,但我对此没有选择。

任何建议,将不胜感激。

4

3 回答 3

3
queue<int>* theArray;

不是

queue<int> theArray[];
于 2012-09-29T23:39:29.513 回答
2

在堆上分配数组时,您会得到指向数组开头的指针,而不是数组。因此,您想将数组声明为

queue<int>* theArray;

在某些情况下允许使用空括号,但具有特定含义。它可以在初始化静态大小的数组时使用:

queue<int> theArray[] = { queue<int>(), queue<int>() /*...*/ };

创建一个大小与初始化器列表匹配的数组,它仍然可以为空。您还可以在函数的参数列表中使用空括号,在这种情况下,使用等同于使用指针表示法,例如:

int main(int ac, char* av[])

等同于

int main(int ac, char** av)
于 2012-09-29T23:42:28.393 回答
1

在 C++ 中无法使用可变大小的数组。要使您的代码正常工作,请使用指针,即

class QueueArray
{
    queue<int> * const theArray;

    QueueArray::QueueArray(int size)
    : theArray (new queue<int>[size])
    { /* ... */ }
    ~QueueArray()
    { delete[] theArray; }
};

但是,在 C++ 中,您应该真正避免这种情况并使用 astd::vector代替,即

typedef vector<queue<int>> QueueArray;
于 2012-09-29T23:42:15.937 回答