2013-02-02 134 views
1

隊列類結構,我更多的是硬件的人,但芯片設計工具,我使用的是要求我寫一些C++代碼。我不熟悉面向對象的編程;雖然我有C.辦理好什麼,我要求的是如何構建我的類(稱爲cq)來完成手頭任務的說明。可變尺寸和類型

我想能夠生成一個指定的數據類型和指定的大小(生成後應該不會改變)的隊列。理想情況下,這將是這樣做...

my_queue = new cq(uint8_t, 6); 

...這將生成六個8位無符號整數的數組(或向量)。

然後,我想的方法既插入一個元素到一個端部和在所述隊列的頭返回元素如下。

uint8_t front; 
front = my_queue.advance(28); 

我需要什麼樣的結構來完成這個?我需要的模板,因爲數據類型是可變的?或者我應該有一個泛型類,並且每個數據類型都有一個類繼承它的結構?

謝謝!

編輯:使用從下面的答案輸入,我已經想出了以下內容:

template <class type> 
template <class size> 
class CQ { 

    private: 
     // Allocates a queue with type and size 
     // specified by template arguments. 
     std::queue<type> cycle_queue(size, 0); 

    public: 
     // Inserts input to the end of the queue; 
     // removes and returns the front element. 
     type advance(type in){ 
      type out = cycle_queue.front(); 
      cycle_queue.push_back(in); 
      cycle_queue.pop_front(); 
      return out; 
     } 

} 

我的問題就變成了......我怎麼在我的主C++程序實例呢?再次

CQ<uint8_t><6> my_queue; 
my_queue.advance(28); 

感謝:我想這一點,但它沒有工作!

回答

1

這看起來像是一個完美的應用程序STL containers.您可以編寫自己的隊列類(作爲模板類,因爲您希望能夠指定數據類型),但爲什麼重新發明輪子?

您正在查找的可能是:std::list,用於FIFO隊列。爲了您的具體的例子:

std::list<uint8_t> my_queue; 
my_queue.push_back(28);   // push an element 
uint8_t front = my_queue.front(); // get the element on the front of the queue 
my_queue.pop_front();    // and then pop it 

如果您還不有點熟悉OOP和C++,編寫自己的模板類可能會有點遙不可及的現在。儘管如果你想嘗試:例如,網絡上有很多參考資料http://www.cplusplus.com/doc/tutorial/templates/

+0

這似乎確實很有吸引力;然而,這種解決方案是否保持恆定的隊列大小?當我開始時,我不希望它是空的。我希望它始終具有我指定的長度並初始化爲零。 –

+0

當你從這個容器中移除元素時會發生什麼? – Spook

+0

@EvanW:所以你想要一個固定大小的鈴聲? – sheu

1

嘗試:

#include <cstdio> 
#include <queue> 

int main(int argc, char * argv[]) 
{ 
    std::deque<int> myQueue; 

    myQueue.push_back(1); 
    myQueue.push_back(2); 
    myQueue.push_back(3); 

    for (int i = 0; i < 3; i++) 
    { 
     int j = myQueue.front(); 
     printf("%d ", j); 
     myQueue.pop_front(); 
    } 

    getchar(); 
} 


編輯:在迴應評論

最簡單的解決方案,這使我的頭腦:

myQueue.push_back(newValue); 
while (myQueue.size > 6) 
    myQueue.pop_front(); 

事實上,您可以很容易地將這些代碼包裝在你自己的類中,例如:

template <class T> 
class SixItemsQueue 
{ 
private: 
    std::deque<T> data; 

public: 
    void Push(T value) 
    { 
     data.push_back(value); 
     while (data.size() > 6) 
      data.pop_front(); 
    } 

    T Pop() 
    { 
     T result = data.front(); 
     data.pop_front(); 
     return result; 
    } 
}; 
+0

這看起來很有吸引力;然而,這種解決方案是否保持恆定的隊列大小?當我開始時,我不希望它是空的。我希望它始終具有我指定的長度並初始化爲零。 –

+0

爲什麼你想要它的大小不變? std :: deque以這種方式實現,儘可能高效地添加和刪除元素。 – Spook

+0

我需要這個隊列來存儲輸入,以便我可以比較要測試的電路的輸出和前一個週期的輸入。例如,如果我的電路接收輸入並在6個週期後生成有效輸入,則需要一個長度爲6的隊列來存儲最後六個週期的輸入。當元素出隊時,我可以將其與輸出進行比較,因爲我知道這是我六個週期前的輸入。 –

2

考慮使用stl containers,像std::vector(這裏:http://www.cplusplus.com/reference/vector/vector/)或std::list(這裏:http://www.cplusplus.com/reference/list/list/)。這些集合已經做到了你想要達到的目的,你的類只需要實現對該集合的訪問器。

原型應該是這樣的:

std::vector Variable<uint8_t>; 

或者,你需要使用Templates。對他們的工作,他們是什麼以及如何全面的解釋可以在這裏找到:http://www.cplusplus.com/doc/tutorial/templates/

在本質上,你將與

cq<uint8_t>(6); 

聲明你的對象,並在構造函數中你會把:

template <class T> 
cq::cq(int amount) { 
    Buffer = new T[amount]; 
} 

請不要忘記在您使用'free'完成後釋放內存。