从类方法无法访问类变量

时间:2019-10-14 04:20:02

标签: c++ oop member-functions

我正在尝试实现循环队列。

我在头文件中声明了队列的大小,并通过构造函数使用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;
}

我试图通过方法返回大小;但是,没有运气。我该怎么做才能访问大小变量?

3 个答案:

答案 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
}