可变大小和类型的队列的类结构

时间:2013-02-02 22:39:54

标签: c++

我更像是一个硬件人,但我正在使用的芯片设计工具要求我编写一些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);

再次感谢!

3 个答案:

答案 0 :(得分: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];
}

一旦你用'免费'完成它,请不要忘记释放内存。

答案 1 :(得分:1)

这看起来像STL containers.的完美应用程序您可以编写自己的队列类(作为模板类,因为您希望能够指定数据类型),但为什么要重新发明轮子?

对于FIFO队列,您可能正在查找:std::list。对于您的特定示例:

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/

答案 2 :(得分: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;
    }
};