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);

再次感谢!

4

3 回答 3

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”完成后释放内存。

于 2013-02-02T22:44:49.590 回答
1

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

您可能正在寻找: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/

于 2013-02-02T22:43:17.397 回答
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;
    }
};
于 2013-02-02T22:43:32.633 回答