我认为问题出在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;
}
最佳答案
您永远不会初始化成员变量front
,rear
和count
。通过再次声明具有相同名称的变量,可以在构造函数中隐藏它们。删除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.front
,q.rear
和q.count
的更改。因此,即使您的构造函数由于变量阴影而损坏,这也是为什么在调用
initQueue
之后仍然不打印期望的内容的原因。您正在修改副本。对于您的实现,它一点也不健壮。您将基础数组公开给类的客户端。这是一个坏主意。队列中的项目不应直接访问。如果我决定直接处理数组怎么办?现在,您所有的状态变量都是错误的。
front
,rear
和count
都可能无效,因为我在不通过任何功能的情况下修改了队列的状态。甚至没有必要;我所能做的就是排队和出队物品。而已。这就是队列的作用。它不是一个数组,如果我想要一个数组,我将使用一个。
因此,总而言之,开始学习一种相对复杂的语言的荣誉。坚持下去,不要气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
。搜索“常量正确性”,以更好地了解为什么要这样做。祝好运!