2012-09-29 41 views
2

我正在研究一個需要隊列QueueArray的項目,該QueueArray是一個隊列數組。自從我使用C++數組以來,這已經有一段時間了,所以我在調試爲什麼我的代碼拋出錯誤時遇到了一些麻煩。可變大小的C++全局數組隊列

我一些靈感讀Delete an array of queue objects(與谷歌幾個小時一起),但我仍然有下面的代碼錯誤:

#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中有一個零大小的數組

錯誤C2075:「theArray」:數組初始化需要大括號

我讀過上漲約2號的錯誤,但我似乎可以找出我需要做什麼來解決它。

我需要它是一個變量大小的數組,它的變量傳遞給類,這就是爲什麼我不能初始化數組的大小,它必須是全局作用域,所以我可以使用它在類中的其他函數(類不能通過參數傳遞數組)。

稍後,隊列將是用戶定義的類型,但是我們現在讓它們成爲整數的隊列,不知道這是否有所作爲。我一直看到有人在這些情況下暗示使用矢量,但我沒有選擇這個。

任何建議,將不勝感激。

回答

1

使用可變大小的數組是不是在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; 
+0

謝謝,我從來沒有這種類型的語法,但它的工作! a/b vectors:我知道載體會容易得多,但它不是我的選擇。 – user1709052

3
queue<int>* theArray; 

queue<int> theArray[]; 
+0

謝謝!我完全忘記了指針。 – user1709052

1

在分配上,你得到堆的數組返回一個指向數組起點的指針,而不是一個數組。因此,您想聲明您的陣列爲

queue<int>* theArray; 

在某些情況下允許使用空括號但具有特定含義。它可以在初始化靜態數組的大小時,可以使用:

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

創建匹配的大小初始化列表的陣列,並且它仍可以是空的。您也可以在函數的參數列表中使用空括號,在這種情況下,使用等同於使用指針表示法,例如,:

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

是相同的

int main(int ac, char** av) 
+0

好的,我過去總是使用空括號表示法,但我也從來沒有嘗試過創建一個像這樣大小不確定的G數組。感謝您的答覆。 – user1709052