我认为问题出在main()中,但是编译良好,但没有输出。我认为可能没有正确启动,因为在 Debug模式下,它说
myCharQ {item=0x0018fa00 "ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ̺yâpú" front=-858993460 rear=-858993460 ...}

您将如何重写它以使其正确?我只是从类开始,所以任何帮助都是有用的。

以下是基于数组的Queue类

#include <iostream>
#include <cstdlib>
using namespace std;

const int MaxQueueSize = 10; // Queue Struct can hold up to 10 char.
typedef char ItemType; // the queue's data type is char

class CPPQueue
{
public:
    CPPQueue();
    ItemType item[MaxQueueSize];
    void initQueue(CPPQueue q);
    bool IsEmpty(CPPQueue q);
    bool IsFull(CPPQueue q);
    void Enqueue(CPPQueue q, ItemType newItem);
    void PrintQ(const CPPQueue q);
    void PrintQueueInfo(CPPQueue myQ);
    ItemType Dequeue(CPPQueue q);
private:
    int front, rear;
    int count;
};
CPPQueue::CPPQueue()
{
    int front, rear, count = 0;
}
void CPPQueue::initQueue(CPPQueue q)
{
    q.front = q.rear = q.count = 0;
}
bool CPPQueue::IsEmpty(CPPQueue q)
{
    return (q.count == 0);
}
bool CPPQueue::IsFull(CPPQueue q)
{
    return (q.count == MaxQueueSize);
}
void CPPQueue::Enqueue(CPPQueue q, ItemType newItem)
{
    if(q.count == MaxQueueSize)
    {
        cerr << "Error! Queue is full, cannot enqueue item.\n" << endl;
        exit(1);
    }
    q.item[q.rear] = newItem;
    q.rear++;
    if (q.rear == MaxQueueSize)
    {
        q.rear = 0; // adjustment for circular queue
    }
    q.count++;
}
ItemType CPPQueue::Dequeue(CPPQueue q)
{
    ItemType theItem;
    if(q.count == 0)
    {
        cerr << "Error! Queue is empty, cannot dequeue item.\n" << endl;
        exit(1);
    }
    theItem = q.item[ q.front ];
    q.front++;
    if (q.front == MaxQueueSize)
    {
        q.front = 0; // adjustment for circular queue
    }
    q.count--;
    return theItem;
}
// Function PrintQ() prints the contents of the queue without changing
// the queue. Printing starts at the "front" index and stops before we
// get to the "rear" index. A decrementing counter controls the loop.
//
void CPPQueue::PrintQ(const CPPQueue q)
{
    int i;
    int qindex = q.front;
    for(i = q.count; i > 0; i--)
    {
        cout << q.item[qindex] ;
        qindex = (++qindex) % MaxQueueSize; // adjustment for circular queue
        if(i > 1)
            cout << ", ";
    }
}
// Helper function for the main program below.
void CPPQueue::PrintQueueInfo(CPPQueue myQ)
{
    cout << "The queue contains: ";
    PrintQ(myQ);
    cout << endl;
}
int main()
{
    CPPQueue myCharQ;// queue holds characters
    char ch; // char dequeued
    myCharQ.initQueue(myCharQ);
    myCharQ.Enqueue(myCharQ, 'a'); myCharQ.PrintQueueInfo(myCharQ);
    myCharQ.Enqueue(myCharQ, 'b'); myCharQ.PrintQueueInfo(myCharQ);
    myCharQ.Enqueue(myCharQ, 'c'); myCharQ.PrintQueueInfo(myCharQ);

    ch = myCharQ.Dequeue(myCharQ); myCharQ.PrintQueueInfo(myCharQ);
    ch = myCharQ.Dequeue(myCharQ); myCharQ.PrintQueueInfo(myCharQ);

    myCharQ.Enqueue(myCharQ, 'e');
    myCharQ.Enqueue(myCharQ, 'f'); myCharQ.PrintQueueInfo(myCharQ);
    myCharQ.Enqueue(myCharQ, 'g'); myCharQ.PrintQueueInfo(myCharQ);
    cout << endl;
    // print the dequeued characters
    while(!myCharQ.IsEmpty(myCharQ))
    {
        ch = myCharQ.Dequeue(myCharQ);
        cout << ch << " ";
    }
    cout << endl << endl;
    return 0;
}

最佳答案

您永远不会初始化成员变量frontrearcount。通过再次声明具有相同名称的变量,可以在构造函数中隐藏它们。删除int并分配它们(尽管这不是为什么不能正确打印值的原因,更多有关此信息)。实际上,也不要这样做。使用初始化列表:

CPPQueue::CPPQueue()
  : front(0), rear(0), count(0)
{ }

另外,为什么还要有initQueue函数?您已经有一个构造函数,请依靠该构造函数来初始化您的实例(不是C!)。

接下来,像IsEmpty这样的函数是非静态成员函数,但是它们不能在当前实例上运行。不要将队列作为参数,只要实例为空,已满等就返回。您的代码必须像这样使用:
Queue q;
q.IsEmpty(q);

真奇怪。您的所有成员函数都以这种方式运行。当您可以使用成员函数时,会将指向当前实例的隐式指针作为隐藏参数(this)传递。因此,每次调用该函数时,它都会在被调用的实例的上下文中运行。您无需将实例作为参数。

还要意识到,所有函数都按值接受参数。您将疯狂地创建这些队列的副本。如果您修改参数,则调用者将看不到该参数。例如:
void CPPQueue::initQueue(CPPQueue q)
{
    q.front = q.rear = q.count = 0;
}

这基本上是没有用的(除了不需要初始化函数的事实)。在操作副本时,在该功能之外将看不到q.frontq.rearq.count的更改。

因此,即使您的构造函数由于变量阴影而损坏,这也是为什么在调用initQueue之后仍然不打印期望的内容的原因。您正在修改副本。

对于您的实现,它一点也不健壮。您将基础数组公开给类的客户端。这是一个坏主意。队列中的项目不应直接访问。如果我决定直接处理数组怎么办?现在,您所有的状态变量都是错误的。 frontrearcount都可能无效,因为我在不通过任何功能的情况下修改了队列的状态。

甚至没有必要;我所能做的就是排队和出队物品。而已。这就是队列的作用。它不是一个数组,如果我想要一个数组,我将使用一个。

因此,总而言之,开始学习一种相对复杂的语言的荣誉。坚持下去,不要气disc,我们都必须在某个时候学习这些东西。

编辑:我必须运行,但是这里是您的某些类(class)的快速重写。我已删除您的typedef作为项目类型。为什么?没必要。您不会根据某个平台或其他环境变化将其更改为其他类型,因此typedef仅会损害您的类的可用性。 typedef对于因某些环境原因而可能会发生变化的事情(即int32_t)很有用,但是如果它们不能帮助您或您的代码客户,那么它们就是另外一回事了。
class CPPQueue
{
public:
    CPPQueue();
    bool IsEmpty() const;
    bool IsFull() const;
    void Enqueue(char newItem);
    char Dequeue();
    void PrintQ() const;
    void PrintQueueInfo() const;
private:
    char item[MaxQueueSize];
    int front
    int rear;
    int count;
};

CPPQueue::CPPQueue()
  : front(0), rear(0), count(0) { }

bool CPPQueue::IsEmpty() const
{
    // you don't actually need the this pointer
    // here, but I included it to make it clear
    // that you are accessing the count variable
    // for the current instance of a CPPQueue
    return this->count == 0;
}

我希望这可以帮助您重写类(class)的其余部分,现在就开始。我在不应该改变const内部状态的函数声明中添加了CPPQueue。搜索“常量正确性”,以更好地了解为什么要这样做。祝好运!

10-08 19:18