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': 配列の初期化には中括弧が必要です

2番目のエラーについて読みましたが、それを修正するために何をする必要があるかを理解しているようです.

クラスに変数が渡された可変サイズの配列である必要があります。そのため、配列のサイズを最初に初期化できません。グローバルスコープでなければならないため、内部の他の関数で使用できますクラス (クラスは、パラメーターを介して配列を渡すことはできません)。

後で、キューはユーザー定義型になりますが、現在は int のキューにしていますが、それが違いを生むかどうかはわかりません。このような場合にベクターの使用を提案している人をよく見かけますが、これについては選択肢がありません。

任意の提案をいただければ幸いです。

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++ ではこれを避け、std::vector代わりにa を使用する必要があります。

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