1

我在为我实现的队列类设置示例测试时遇到了一些问题。

这是队列类:

队列.h:

    typedef float QueueInfoType;
    QueueInfoType x;
    class Queue
    {
      public:
        Queue(){front = rear = count = 0;}

        bool isEmpty();

        bool isFull();

        void add(QueueInfoType x);

        float remove();

        int numItems();

        enum {MAXQUEUE = 80};

      private:
        QueueInfoType values[MAXQUEUE];
        int front, rear, count;
    };

队列.cpp:

    bool Queue::isEmpty()
    {
      return front == rear;
    }

    bool Queue::isFull()
    {
      return count >= MAXQUEUE;
    }

    void Queue::add(QueueInfoType x)
    {
      values[rear = (rear + 1) % MAXQUEUE] = x;
      count = count + 1;
    }

    float Queue::remove()
    {
      count = count - 1;
      return x = values[front = (front + 1) % MAXQUEUE];
    }

    int Queue::numItems()
    {
      return count;
    }

测试方法:

    [TestMethod]
    void TestNumItems()
    {
        Queue q;
        for(int i = 0; i < 20; i++)
        {
            q.add(i);
        }
        int expected = 2;
        int actual = q.numItems();
        Assert::AreEqual(expected, actual,  "queue had: " + actual + " items");
    };

我显然遗漏了一些东西,当我调用 add 方法将项目添加到队列时,我的队列计数永远不会增加,但是项目会很好地添加到队列中。

我正在一个静态库中编译我的队列类,并在我的测试项目中添加对它的引用。

任何想法为什么我的队列的计数永远不会改变?

编辑:

我正在使用此类创建一个循环队列,该队列具有由 MAXQUEUE 定义的最大项目数。

以上是 QueueInfoType 是如何定义的。

笔记:

当我将静态库更改为可执行文件并添加void main()到我的 queue.cpp 并编写代码来测试队列的功能时,它工作得很好并且 count 返回正确。当它被测试项目用作静态库时会发生什么事情吗?

4

3 回答 3

0

尝试将测试例程中的 for 循环更改为:

    for(int i = 0; i < 20; i++)
    {
        q.add(i + 100);
    }

如果您最终得到不同的计数,那么这是因为您不小心超出了数组的范围并损坏了堆栈。由于变量的定义方式,它们最终可能成为堆栈上的邻居。  

于 2011-10-03T18:06:38.550 回答
0

我认为您的预期应该是“20”。

此外,remove 正在返回一个“float”,但它可能应该是一个 QueueInfoType。

我进行了测试,它运行良好(除了测试 20 vs 2)。我的测试实际是 20。

此外,“x =”在 remove 中的分配似乎不正确。

于 2011-10-03T17:49:10.660 回答
0

我不确定,但是队列类必须使用指针来实现,所以没有大小限制,你也可以在 add 函数中使用类似的东西:

void Queue::add(QueueInfoType x)
{
  count++;
  values[count] = x;
}

所以实现更容易理解,关于你的错误......我找不到它,它可能会工作......我会继续思考。

PD:对不起我的英语

于 2011-10-03T17:36:14.200 回答