【问题标题】:Class variable not reachable from class method类方法无法访问类变量
【发布时间】:2019-10-14 04:20:02
【问题描述】:

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

我已经在头文件中声明了队列的大小,并且我通过构造函数使用大小变量启动了我的队列。

这里是 queue.hqueue.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.cpp

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;
}

这是我的主要内容

int main()
{

   Queue q1(10);
   q1.enqueue(20);
   q1.Display();
   return 0;
}

问题:尽管我在 main 中使用 size 创建了对象,但显示函数内部的循环看不到 size 变量。当我调试程序时,我看到大小为 0,因此 for 循环永远不会启动。

我尝试了什么

 int Queue::sizeQ(){
   return size;
}

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

【问题讨论】:

    标签: c++ oop member-functions


    【解决方案1】:

    目前,您的构造函数会创建一个本地数组,该数组在完成后会被销毁。你不想这样做。

    如果你想在运行时设置数组的大小,它必须在堆上声明。为此,您应该在标题中更改数组 A 的声明:

    int *A;
    

    然后在你的构造函数中你可以在堆上分配数组:

    Queue::Queue(int iSize): 
        size(iSize), front(-1), rear(-1)
    {
       A = new int[size];
    }
    

    注意初始化列表正在初始化成员变量大小,前后。

    您还必须释放您的数组。为此,将析构函数添加到您的类 Queue 并执行以下操作:

    Queue::~Queue()
    {
       delete [] A;
    }
    

    这将释放 A 使用的内存。

    【讨论】:

      【解决方案2】:
      Queue::Queue(int size)
      {
         int A[size];
         front = rear = -1;
      }
      

      你永远不会在这里初始化this-&gt;size。因此sizeQ() 返回size 成员的未初始化值。

      在构造函数中添加this-&gt;size = size;

      编辑:int A[size] 没有做你认为它做的事情。它正在创建一个本地数组,与成员A 无关。请参阅@jignatius 答案以了解如何修复它。

      【讨论】:

      • 这里的A是一个本地数组,当构造函数完成时会被销毁。此外,您还依赖非标准 GCC 扩展在运行时创建给定大小的数组。
      • @jignatius 是的。忽略了它。谢谢。
      • 另外,int A[size]' 不是有效的 C++。在 C 中没问题,一些编译器支持它作为 C++ 中的(隐蔽的)扩展。
      【解决方案3】:

      在构造函数中初始化大小,如下所示:

      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
      }   
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-06-04
        • 1970-01-01
        • 1970-01-01
        • 2018-10-17
        • 2015-12-07
        • 1970-01-01
        • 2011-09-05
        • 1970-01-01
        相关资源
        最近更新 更多