我正在尝试实现循环队列。
我在头文件中声明了队列的大小,并通过构造函数使用size变量启动了队列。
这是 queue.h 和 queue.cpp 文件。
startService()
这是queue.cpp
class Queue
{
public:
int size;
int front, rear;
int A[];
Queue(int size);
bool isEmpty();
void enqueue(int n);
int dequeue();
int Peek();
void Display();
int sizeQ();
};
这是我的主要
Queue::Queue(int size)
{
int A[size];
front = rear = -1;
}
bool Queue::isEmpty(){
if((front == -1) && (rear == -1))
return true;
else
return false;
}
void Queue::Display(){
if(isEmpty()){
cout << "Its empty! Nothing to display"<<endl;
}else{
for(int i=0; i<sizeQ(); i++){
cout << A[i] << endl;
}
}
cout <<endl;
}
问题:尽管我使用main内部的size创建了对象,但显示函数内部的循环看不到size变量。当我调试程序时,我看到大小为0,因此for循环永远不会开始。
我尝试过的事情
int main()
{
Queue q1(10);
q1.enqueue(20);
q1.Display();
return 0;
}
我试图通过方法返回大小;但是,没有运气。我该怎么做才能访问大小变量?
答案 0 :(得分:2)
当前,您的构造函数创建了一个本地数组,该数组在完成后会被销毁。您不想这样做。
如果要在运行时设置数组的大小,则必须在堆上声明它。为此,您应该在标头中更改数组A的声明:
int *A;
然后在构造函数中,您可以在堆上分配数组:
Queue::Queue(int iSize):
size(iSize), front(-1), rear(-1)
{
A = new int[size];
}
请注意,初始化程序列表是初始化成员变量大小(前后)。
还必须取消分配数组。为此,将一个析构函数添加到您的类Queue中,然后执行以下操作:
Queue::~Queue()
{
delete [] A;
}
这将释放A使用的内存。
答案 1 :(得分:0)
Queue::Queue(int size)
{
int A[size];
front = rear = -1;
}
您永远不会在这里初始化this->size
。因此,sizeQ()
返回size
成员的未初始化值。
在构造函数中添加this->size = size;
。
编辑:int A[size]
并没有您认为的那样。它正在创建一个本地数组,与成员A
无关。请参阅@jignatius答案以了解如何解决此问题。
答案 2 :(得分:0)
在构造函数中初始化大小,如下所示:
Queue::Queue(int nSize) //changed name of parameter to nSize to remove confusion
{
int A[size];
front = rear = -1;
size = nSize; // Initialize passed param to member variable of class
}